博客
关于我
APScheduler 定时模块使用
阅读量:328 次
发布时间:2019-03-04

本文共 4766 字,大约阅读时间需要 15 分钟。

APScheduler:一个强大的Python任务调度器

作为一个高级的Python任务调度器,APScheduler能够帮助开发者轻松管理定时任务和延时任务。它支持多种时间格式,允许任务存储在内存、数据库或其他持久化存储系统中,确保任务不会因程序异常而丢失。以下是APScheduler的详细介绍

安装命令APScheduler的安装非常简单,可以通过以下命令在Python环境中安装:

pip install apscheduler

时间格式APScheduler支持多种时间格式,满足不同场景的需求:

  • date:执行任务的特定日期和时间,支持类 UNIX 系统中的Crontab格式。
  • interval:固定间隔时间执行任务,支持秒、分钟、小时、周等时间单位。
  • cron:类似于Crontab的时间格式,支持灵活的定时规则。
  • APScheduler的核心组件APScheduler由四个主要组件组成,分别负责不同的任务管理模块:

  • 触发器(Triggers):决定任务何时执行,支持多种时间格式。
  • 任务存储(Jobs):存储任务的属性,包括执行时间和可调用对象。默认使用内存存储,但支持切换到数据库(如MySQL、MongoDB)或其他持久化存储系统。
  • 执行器(Executors):负责将存储中的任务交给线程池或进程池执行。
  • 调度器(Schedulers):根据使用的框架选择合适的调度器。例如:
    • AsyncIO应用应使用 AsyncIOScheduler
    • Gevent应用应使用 GeventScheduler
    • 无框架应用应使用默认的 BlockingScheduler
  • 使用示例以下是一个简单的使用示例,展示了如何在没有框架应用中使用APScheduler:

    from apscheduler.schedulers.blocking import BlockingSchedulerfrom apscheduler.triggers.interval import IntervalTriggerimport datetimeimport time# 初始化调度器scheduler = BlockingScheduler()# 定义任务函数def show_time():    print(f"当前时间:{datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")    print("这是由APScheduler定时执行的任务.")# 添加间隔任务# 间隔为2秒scheduler.add_job(show_time, IntervalTrigger(interval=2, seconds=2))# 启动调度器try:    scheduler.start()except KeyboardInterrupt:    scheduler.shutdown(wait=False)

    运行结果:每隔2秒,程序会输出当前时间。这是使用 interval 时间格式的示例。如果需要更换时间单位(如分钟),只需将 seconds=2 修改为 minutes=1 即可。

    Cron格式示例以下是一个使用Cron格式定时任务的示例:

    from apscheduler.schedulers.blocking import BlockingSchedulerfrom apscheduler.triggers.cron import CronTriggerimport datetime# 初始化调度器scheduler = BlockingScheduler()# 定义任务函数def show_time():    print(f"当前时间:{datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")    print("这是由APScheduler cron格式定时执行的任务.")# 添加Cron任务# 每天7点到22点,每2分钟的第10秒执行scheduler.add_job(    show_time,    CronTrigger(        cron_expression='0 */2 * * *',        day_of_week='*/5',        hour='7-22',        second='10'    ))# 启动调度器try:    scheduler.start()except KeyboardInterrupt:    scheduler.shutdown(wait=False)

    运行结果:每天7点到22点之间,每2分钟的第10秒,程序会执行指定的任务。

    特定时间执行如果需要在特定时间执行任务,可以使用 date 时间格式:

    from apscheduler.schedulers.blocking import BlockingSchedulerfrom apscheduler.triggers.date import DateTriggerimport datetime# 初始化调度器scheduler = BlockingScheduler()# 定义任务函数def show_time():    print(f"当前时间:{datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")    print("这是由APScheduler date格式执行的任务.")# 添加特定时间任务# 2020年12月4日16:27执行scheduler.add_job(    show_time,    DateTrigger(        date=datetime.datetime(2020, 12, 4, 16, 27)    ))# 启动调度器try:    scheduler.start()except KeyboardInterrupt:    scheduler.shutdown(wait=False)

    运行结果:在2020年12月4日16:27,程序将执行指定的任务。

    任务范围内执行APScheduler支持设置任务的执行范围。例如,可以指定任务从2020年12月4日到2020年12月5日每天运行:

    from apscheduler.schedulers.blocking import BlockingSchedulerfrom apscheduler.triggers.cron import CronTriggerimport datetime# 初始化调度器scheduler = BlockingScheduler()# 定义任务函数def show_time():    print(f"当前时间:{datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")    print("这是由APScheduler cron格式定时执行的任务.")# 添加Cron任务# 2020年12月4日至2020年12月5日,每天7点到22点,每2分钟的第10秒执行scheduler.add_job(    show_time,    CronTrigger(        cron_expression='0 */2 * * *',        day_of_week='*/5',        hour='7-22',        start_date='2020-12-4',        end_date='2020-12-5'    ))# 启动调度器try:    scheduler.start()except KeyboardInterrupt:    scheduler.shutdown(wait=False)

    常见问题

  • 如何配置APScheduler使用MySQL存储?

    • 可以使用 sqlalchemy 存储模块,将作业存储到MySQL数据库中。
    • 示例代码:
      from apscheduler.schedulers.blocking import BlockingSchedulerfrom apscheduler.storage.sqlalchemy import SQLAlchemyStorageimport sqlalchemy# 初始化数据库连接engine = sqlalchemy.create_engine('mysql://root:password@localhost:3306/mydb')storage = SQLAlchemyStorage(engine, schema_name='apscheduler_jobs')# 初始化调度器scheduler = BlockingScheduler(storage=storage)
  • 如何将作业存储到Redis?

    • 使用 apscheduler.storage.redis 模块,将作业存储到Redis数据库中。
    • 示例代码:
      from apscheduler.schedulers.blocking import BlockingSchedulerfrom apscheduler.storage.redis import RedisStorageimport redis# 初始化Redis连接redis_conn = redis.Redis(host='localhost', port=6379, db=0)# 初始化调度器scheduler = BlockingScheduler(storage=RedisStorage(redis_conn))
  • 如何在异步应用中使用APScheduler?

    • 对于使用 AsyncIO 的应用,应使用 AsyncIOScheduler
    • 示例代码:
      from apscheduler.schedulers.asyncio import AsyncIOSchedulerfrom apscheduler.triggers.interval import IntervalTriggerimport asyncioimport datetime# 初始化调度器scheduler = AsyncIOScheduler()# 定义任务函数async def show_time():    print(f"当前时间:{datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")    print("这是由APScheduler异步执行的任务.")# 添加间隔任务scheduler.add_job(    show_time,    IntervalTrigger(interval=5, seconds=5))# 启动调度器async def main():    scheduler.start()if __name__ == '__main__':    asyncio.run(main())
  • 结论APScheduler是Python世界中一个功能强大的任务调度器,它支持多种时间格式和存储方式,适合处理各种定时任务需求。通过灵活的配置选项,开发者可以根据具体场景选择最优的任务执行方式。如果你需要在Python程序中实现类似Linux的Crontab定时任务,APScheduler无疑是一个非常不错的选择。

    转载地址:http://evwh.baihongyu.com/

    你可能感兴趣的文章
    MySQL8修改密码的方法
    查看>>
    Mysql8在Centos上安装后忘记root密码如何重新设置
    查看>>
    Mysql8在Windows上离线安装时忘记root密码
    查看>>
    MySQL8找不到my.ini配置文件以及报sql_mode=only_full_group_by解决方案
    查看>>
    mysql8的安装与卸载
    查看>>
    MySQL8,体验不一样的安装方式!
    查看>>
    MySQL: Host '127.0.0.1' is not allowed to connect to this MySQL server
    查看>>
    Mysql: 对换(替换)两条记录的同一个字段值
    查看>>
    mysql:Can‘t connect to local MySQL server through socket ‘/var/run/mysqld/mysqld.sock‘解决方法
    查看>>
    MYSQL:基础——3N范式的表结构设计
    查看>>
    MYSQL:基础——触发器
    查看>>
    Mysql:连接报错“closing inbound before receiving peer‘s close_notify”
    查看>>
    mysqlbinlog报错unknown variable ‘default-character-set=utf8mb4‘
    查看>>
    mysqldump 参数--lock-tables浅析
    查看>>
    mysqldump 导出中文乱码
    查看>>
    mysqldump 导出数据库中每张表的前n条
    查看>>
    mysqldump: Got error: 1044: Access denied for user ‘xx’@’xx’ to database ‘xx’ when using LOCK TABLES
    查看>>
    Mysqldump参数大全(参数来源于mysql5.5.19源码)
    查看>>
    mysqldump备份时忽略某些表
    查看>>
    mysqldump实现数据备份及灾难恢复
    查看>>