三方模块设置定时任务
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)
python防脱发技巧

浙公网安备 33010602011771号