安装:
pip install apscheduler
1. APScheduler四大组件:
- 触发器 triggers :用于设定触发任务的条件
- 任务储存器 job stores:用于存放任务,把任务存放在内存或数据库中
- 执行器 executors: 用于执行任务,可以设定执行模式为单线程或线程池
- 调度器 schedulers: 把上方三个组件作为参数,通过创建调度器实例来运行
2. 调度器组件详解
根据开发需求选择相应的组件,下面是不同的调度器组件:
- BlockingScheduler 阻塞式调度器:适用于只跑调度器的程序。
- BackgroundScheduler 后台调度器:适用于非阻塞的情况,调度器会在后台独立运行。
- AsyncIOScheduler AsyncIO调度器,适用于应用使用AsnycIO的情况。
- GeventScheduler Gevent调度器,适用于应用通过Gevent的情况。
- TornadoScheduler Tornado调度器,适用于构建Tornado应用。
- TwistedScheduler Twisted调度器,适用于构建Twisted应用。
- QtScheduler Qt调度器,适用于构建Qt应用。
3. APScheduler有三种内置的触发器:
- date 日期:触发任务运行的具体日期
- interval 间隔:触发任务运行的时间间隔
- cron 周期:触发任务运行的周期
- calendarinterval:当您想要在一天中的特定时间以日历为基础的间隔运行任务时使用
- 3.1 date 是最基本的一种调度,作业任务只会执行一次。它表示特定的时间点触发。它的参数如下:
参数 | 说明 |
run_date(datetime or str) | 任务运行的日期或者时间 |
timezone(datetime.tzinfo or str) | 指定时区 |
from datetime import date
from apscheduler.schedulers.blocking import BlockingScheduler
scheduler = BlockingScheduler()
def my_job(text):
print(text)
# 在2019年4月15日执行
scheduler.add_job(my_job, 'date', run_date=date(2019, 4, 15), args=['测试任务'])
scheduler.start()
###########################################################################################
import datetime
from apscheduler.schedulers.blocking import BlockingScheduler
scheduler = BlockingScheduler()
def my_job(text):
print(text)
# datetime类型(用于精确时间)
scheduler.add_job(my_job, 'date', run_date=datetime(2019, 4, 15, 17, 30, 5), args=['测试任务'])
scheduler.start()
- 3.2 interval 周期触发任务
固定时间间隔触发。interval 间隔调度,参数如下:
参数 | 说明 |
weeks(int) | 间隔几周 |
days(int) | 间隔几天 |
hours(int) | 间隔几小时 |
minutes(int) | 间隔几分钟 |
seconds(int) | 间隔多少秒 |
start_date(datetime or str) | 开始日期 |
end_date(datetime or str) | 结束日期 |
timezone(datetime.tzinfo or str) | 时区 |
from datetime import datetime
from apscheduler.schedulers.blocking import BlockingScheduler
def job_func():
print("当前时间:", datetime.datetime.utcnow().strftime("%Y-%m-%d %H:%M:%S.%f")
scheduler = BlockingScheduler()
# 每2小时触发
scheduler.add_job(job_func, 'interval', hours=2)
# 在 2019-04-15 17:00:00 ~ 2019-12-31 24:00:00 之间, 每隔两分钟执行一次 job_func 方法
scheduler .add_job(job_func, 'interval', minutes=2, start_date='2019-04-15 17:00:00' , end_date='2019-12-31 24:00:00')
scheduler.start()
3.3 cron 触发器
在特定时间周期性地触发,和Linux crontab格式兼容。它是功能最强大的触发器。
cron 参数:
参数 | 说明 |
year(int or str) | 年,4位数字 |
month(int or str) | 月(范围1-12) |
day(int or str) | 日(范围1-31) |
week(int or str) | 周(范围1-53) |
day_of_week(int or str) | 周内第几天或者星期几(范围0-6或者mon,tue,wed,thu,fri,stat,sun) |
hour(int or str) | 时(0-23) |
minute(int or str) | 分(0-59) |
second(int or str) | 秒(0-59) |
start_date(datetime or str) | 最早开始日期(含) |
end_date(datetime or str) | 最晚结束日期(含) |
timezone(datetime.tzinfo or str) | 指定时区 |
表达式 | 参数类型 | 描述 |
| 所有 | 通配符。例: |
| 所有 | 可被a整除的通配符。 |
| 所有 | 范围a-b触发 |
| 所有 | 范围a-b,且可被c整除时触发 |
| 日 | 第几个星期几触发。x为第几个,y为星期几 |
| 日 | 一个月中,最后个星期几触发 |
| 日 | 一个月最后一天触发 |
| 所有 | 组合表达式,可以组合确定值或上方的表达式 |
注意:month和day_of_week参数分别接受的是英语缩写jan– dec 和 mon – sun
import datetime
from apscheduler.schedulers.background import BackgroundScheduler
def job_func(text):
print("当前时间:", datetime.datetime.utcnow().strftime("%Y-%m-%d %H:%M:%S.%f")[:-3])
scheduler = BackgroundScheduler()
# 在每年 1-3、7-9 月份中的每个星期一、二中的 00:00, 01:00, 02:00 和 03:00 执行 job_func 任务
scheduler .add_job(job_func, 'cron', month='1-3,7-9',day='0, tue', hour='0-3')
scheduler.start()