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
21from 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
13if __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
12if __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运行注:如果现在的时间正好是程序指定的运行时间是不会运行的,程序会判断由一个时间跨入到指定的时间时,才会运行