三方模块设置定时任务

1. apscheduler模块下载方式

pip install apscheduler

2. 阻塞调度器(BlockingScheduler) 示例代码

2.1 间歇性定时任务(interval 方式任务调度)

from datetime import datetime
import os
from apscheduler.schedulers.blocking import BlockingScheduler

def tick():
    print('Tick! The time is: %s' % datetime.now())

if __name__ == '__main__':
    scheduler = BlockingScheduler()

    # 指定执行方式为interval 即定时任务模式
    scheduler.add_job(tick, 'interval', seconds=3)
    # 主线程比定时任务执行的快, 首先会执行主线程中的代码,打印一波,然后每隔3s 执行一次tick()函数 
    print('Press Ctrl+{0} to exit'.format('Break' if os.name == 'nt' else 'C    '))

    try:
        scheduler.start()
    except (KeyboardInterrupt, SystemExit):
        pass

2.1.1 以上代码基本流程阐述

说明:
第 1 行代码声明文件内容以 utf-8 编码,告诉Python 解释器以 utf-8 编码解析源代码文件。

导入 datetime 模块,用于打印当前时间。导入 os 模块,用于判断操作系统类型。

导入调度器模块 BlockingScheduler,这是最简单的调度器,调用 start 方阻塞当前进程,如果你的程序只用于调度,除了调度进程外没有其他后台进程,那么请用 BlockingScheduler 非常有用,此时调度进程相当于守护进程。

定义一个函数 tick 代表我们要调度的作业程序。

实例化一个 BlockingScheduler 类,不带参数表明使用默认的作业存储器-内存,默认的执行器是线程池执行器,最大并发线程数默认为 10 个(另一个是进程池执行器)。

第 11 行添加一个作业 tick,触发器为 interval,每隔 3 秒执行一次,另外的触发器为 date,cron。date 按特定时间点触发,cron 则按固定的时间间隔触发。
加入捕捉用户中断执行和解释器退出异常,pass 关键字,表示什么也不做。

执行结果如下所示:

Press Ctrl+Break to exit
Tick! The time is: 2021-11-12 09:00:01.339259
Tick! The time is: 2021-11-12 09:00:04.327113
Tick! The time is: 2021-11-12 09:00:07.330031
Tick! The time is: 2021-11-12 09:00:10.328921

可以看出,每 3 秒打印出了当前时间。

2.2 自定义时间任务调度(cron 方式任务调用)

from datetime import datetime
import os
from apscheduler.schedulers.blocking import BlockingScheduler

def tick():
    print('Tick! The time is: %s' % datetime.now())

if __name__ == '__main__':
    scheduler = BlockingScheduler()
    scheduler.add_job(tick, 'cron', hour=19,minute=23)
    print('Press Ctrl+{0} to exit'.format('Break' if os.name == 'nt' else 'C    '))

    try:
        scheduler.start()
    except (KeyboardInterrupt, SystemExit):
        pass

2.2.2 对以上代码基本流程阐述

定时 cron 任务也非常简单,直接给触发器 trigger 传入 ‘cron’ 即可。hour =19 ,minute =23 这里表示每天的19:23 分执行任务。这里可以填写数字,也可以填写字符串

hour =19 , minute =23
hour ='19', minute ='23'
minute = '*/3' 表示每 5 分钟执行一次
hour ='19-21', minute= '23' 表示 19:23、 20:23、 21:23 各执行一次任务

3. 配置各个调度器之间的区别

在配置调度器前,我们首先要选取适合我们应用环境场景的调度器,存储器和执行器。下面是各调度器的适用场景:

BlockingScheduler:适用于调度程序是进程中唯一运行的进程,调用start函数会阻塞当前线程,不能立即返回。
BackgroundScheduler:适用于调度程序在应用程序的后台运行,调用start后主线程不会阻塞。
AsyncIOScheduler:适用于使用了asyncio模块的应用程序。
GeventScheduler:适用于使用gevent模块的应用程序。
TwistedScheduler:适用于构建Twisted的应用程序。
QtScheduler:适用于构建Qt的应用程序。
上述调度器可以满足我们绝大多数的应用环境,本文以两种调度器为例说明如何进行调度器配置。

非阻塞定时任务调度器(BackgroundScheduler) 示例代码

from datetime import datetime
import os
import time

from apscheduler.schedulers.background import BackgroundScheduler
# from apscheduler.schedulers.blocking import BlockingScheduler

def tick():
    print('Tick! The time is: %s' % datetime.now())

if __name__ == '__main__':
    scheduler = BackgroundScheduler()
    scheduler.add_job(tick, 'interval', seconds=1)
    scheduler.start()
    print('Press Ctrl+{0} to exit'.format('Break' if os.name == 'nt' else 'C    '))
    # 主线程一直执行,定时任务才会不停执行,只要主线程退出,整个代码全部退出,定时任务就不会执行
    time.sleep(120)


posted @ 2021-11-12 08:54  河图s  阅读(113)  评论(0)    收藏  举报