APScheduler配置调度器
目录
配置调度器
调度器的作用
调度器的主循环其实就是反复检查是否有到期需要执行的任务,分以下两步进行。
(1)询问自己的每一个作业存储器,有没有到期需要执行的任务。如果有需要执行的任务,就计算这些作业中每个作业需要运行的时间
(2)提交给执行器按时间点运行。
在配置调度器前,首先需要选取适合应用环境场景的调度器、存储器和执行器。下面是各调度器的适用场景:
schedulers: 调度器主要分三种,一种独立运行的,一种是后台运行的,最后一种是配合其它程序使用
- BlockingScheduler:适用于调度程序,是进程中唯一运行的进程,调用start函数会阻塞当前线程,不能立即返回。
- BackgroundScheduler:适用于调度程序,在应用程序的后台运行,调用start后主线程不会阻塞。
- AsyncIOScheduler: 当你的程序是 异步IO模型 的时候使用
- GeventScheduler: 和 gevent 框架配套使用
- TornadoScheduler: 和 tornado 框架配套使用
- TwistedScheduler: 和 Twisted 框架配套使用
- QtScheduler: 开发 qt 应用的时候使用
scheduler = BlockingScheduler(jobstores=jobstores, executors=executors, job_defaults=job_defaults)
如果调度程序在应用程序的后台运行,则选择BackgroundScheduler,并使用默认的jobstore和executor。
from apscheduler.schedulers.background import BackgroundScheduler scheduler = BackgroundScheduler()
作业存储器的选择
作业存储器的选择主要有两种:一是内存,也是默认的配置;二是数据库。具体选哪种要看我们的应用程序在崩溃时是否重启整个应用程序,如果重启整个应用程序,作业就会被重新添加到调度器中,此时选取内存作为作业存储器既简单又高效。但是,如果调度器重启或应用程序崩溃,就需要作业从中断时恢复正常运行,我们通常选择将作业存储在数据库中,使用哪种数据库取决于在编程环境中使用了什么数据库。我们可以自由选择,PostgreSQL是推荐的选择,因为它具有强大的数据完整性保护。
job stores: 支持四种任务存储方式
- memory:默认配置任务存在内存中
- mongdb:支持文档数据库存储
- sqlalchemy:支持关系数据库存储
- redis:支持键值对数据库存储
内存作为作业存储器:
jobstores = { 'default': MemoryJobStore() }
数据库作为作业存储器:
jobstores = { 'default': SQLAlchemyJobStore(url='sqlite:///jobs.sqlite') }
触发器
triggers: 支持三种任务触发方式
date:固定日期触发器
date:固定日期触发器,任务只运行一次,运行完毕自动清除;若错过指定运行时间,任务不会被创建
参数 说明 run_date (datetime 或 str) 作业的运行日期或时间 timezone (datetime.tzinfo 或 str) 指定时区 例如# 在 2019-4-24 00:00:01 时刻运行一次 start_system 方法 scheduler .add_job(start_system, 'date', run_date='2019-4-24 00:00:01', args=['text'])
interval:时间间隔触发器
interval:时间间隔触发器,每个一定时间间隔执行一次。
参数 说明 weeks (int) 间隔几周 days (int) 间隔几天 hours (int) 间隔几小时 minutes (int) 间隔几分钟 seconds (int) 间隔多少秒 start_date (datetime 或 str) 开始日期 end_date (datetime 或 str) 结束日期
例:
# 在 2019-4-24 00:00:00 - 2019-4-24 08:00:00 之间, 每隔两小时执行一次 alarm_job 方法 scheduler .add_job(alarm_job, 'interval', hours=2, start_date='2019-4-24 00:00:00' , end_date='2019-4-24 08:00:00')
cron:cron风格的任务触发
参数 说明 year (int 或 str) 表示四位数的年份 (2019) month(int|str) 月 (范围1-12) day(int|str) 日 (范围1-31) week(int|str) 周 (范围1-53) day_of_week (int|str) 表示一周中的第几天,既可以用0-6表示也可以用其英语缩写表示 hour (int|str) 表示取值范围为0-23时 minute (int|str) 表示取值范围为0-59分 second (int|str) 表示取值范围为0-59秒 start_date (datetime|str) 表示开始时间 end_date (datetime|str) 表示结束时间 timezone (datetime.tzinfo|str) 表示时区取值
- (int|str) 表示参数既可以是int类型,也可以是str类型
- (datetime | str) 表示参数既可以是datetime类型,也可以是str类型
例如:表示每5秒执行该程序一次,相当于interval 间隔调度中seconds = 5
sched.add_job(my_job, 'cron',second = '*/5')
执行器的选择
同样的,执行器的选择也取决于应用场景。通常默认的ThreadPoolExecutor已经足够好。如果作业负载涉及CPU密集型操作,那么应该考虑使用ProcessPoolExecutor,甚至可以同时使用这两种执行器,将ProcessPoolExecutor执行器添加为二级执行器。
executors = { 'default': ThreadPoolExecutor(20), 'processpool': ProcessPoolExecutor(10) }
配置调度器:
- 配置名为mongo的MongoDBJobStore作业存储器;
- 配置名为default的SQLAlchemyJobStore(使用SQLite);
- 配置名为default的ThreadPoolExecutor,最大线程数为20;
- 配置名为processpool的ProcessPoolExecutor,最大进程数为5;
- UTC作为调度器的时区;
- coalesce默认情况下关闭;
- 作业的默认最大运行实例限制为3。
jobstores = { 'default': MemoryJobStore() } executors = { 'default': ThreadPoolExecutor(20), 'processpool': ProcessPoolExecutor(10) } job_defaults = { 'coalesce': False, 'max_instances': 3 }
注:主流数据库系统都支持COALESCE()函数,这个函数主要用来进行空值处理
参考文档:https://blog.csdn.net/qq_33196814/article/details/90049075