python 调度

python的任务调度模块,apscheduler,它主要包含了四种组件triggers(触发器)、job stores(任务存储器)、executors(执行器)、schedulers(定时调度器)。

  • 安装

    pip install apscheduler

  • 定时器种类

    BlockingScheduler:当调度器是进程中唯一运行的程序时使用

    BackgroundScheduler:在不使用下面任何框架时使用,并希望调度器在应用程序的后台运行。

    AsyncIOScheduler:你使用的应用程序中必须有asyncio模块

    GeventScheduler:在你的应用程序中必须有gevent模块

    TornadoScheduler:你的应用程序是Tornado框架可以使用

    TwistedScheduler:你的应用程序是Twisted框架可以使用

    QtScheduler: 在QT框架中使用

  • 触发器种类

    date:一次性任务,即只执行一次任务

    interval:循环任务,即按照时间间隔执行任务

    cron:定时任务,即在每个时间段执行任务

主要记录使用BlockingScheduler定时器

  • 当指定触发器为date时

    参数如下:

    next_run_time(datetime|str):下一次执行任务时间

    timezone(datetime.tzinfo|str):时区

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    from apscheduler.schedulers.blocking import BlockingScheduler
    import datetime


    def job1():
    print('this is job1')


    def job2(para1, para2):
    print('this is job2,para1:{},para2:{}'.format(para1, para2))


    if __name__ == '__main__':
    schedule = BlockingScheduler()
    schedule.add_job(func=job1, trigger="date", next_run_time=datetime.datetime.now()+datetime.timedelta(seconds=5))
    schedule.add_job(func=job2, args=('job2', '10秒后运行'), trigger="date", next_run_time=datetime.datetime.now() + datetime.timedelta(seconds=10))
    schedule.start()

    输出:
    this is job1
    this is job2,para1:job2,para2:10秒后运行
  • 当指定触发器为interval时

    参数如下:
    seconds (int) – 秒
    minutes (int) – 分钟
    hours (int) – 小时
    days (int) – 日
    weeks (int) – 周
    start_date (datetime|str) – 启动开始时间
    end_date (datetime|str) – 最后结束时间
    timezone (datetime.tzinfo|str) – 时区

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    if __name__ == '__main__':
    schedule = BlockingScheduler()
    schedule.add_job(func=job1, trigger="interval", minutes=1)
    schedule.add_job(func=job2, args=('job2', '每个30秒运行一次'), trigger="interval", seconds=30)
    schedule.start()

    输出:
    this is job2,para1:job2,para2:每个30秒运行一次
    this is job2,para1:job2,para2:每个30秒运行一次
    this is job1
    this is job2,para1:job2,para2:每个30秒运行一次
    this is job2,para1:job2,para2:每个30秒运行一次
    this is job1
  • 当指定触发器为cron时

    参数如下:

    second (int|str) – 秒 (0-59)
    minute (int|str) – 分钟 (0-59)
    hour (int|str) – 小时 (0-23)
    day_of_week (int|str) – 一周中的第几天 (0-6 or mon,tue,wed,thu,fri,sat,sun)
    day (int|str) – 日 (1-31)
    week (int|str) – 一年中的第几周 (1-53)
    month (int|str) – 月 (1-12)
    year (int|str) – 年(四位数)
    start_date (datetime|str) – 最早开始时间
    end_date (datetime|str) – 最晚结束时间
    timezone (datetime.tzinfo|str) – 时区

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    if __name__ == '__main__':
    schedule = BlockingScheduler()
    # 每个小时的42分运行
    schedule.add_job(func=job1, trigger="cron", minute=42)
    schedule.add_job(func=job2, args=('job2', '每个月的21日的16:42运行'), trigger="cron", day=21, hour=16, minute=42)
    schedule.add_job(func=job2, args=('job2', '每周的周三16:42运行'), trigger="cron", day_of_week=2, hour=16, minute=42)
    schedule.start()

    输出:
    this is job2,para1:job2,para2:每个月的21日的16:40运行
    this is job1
    this is job2,para1:job2,para2:每周的周三16:40运行

    注:如果现在的时间正好是程序指定的运行时间是不会运行的,程序会判断由一个时间跨入到指定的时间时,才会运行