APScheduler配置调度器

来自CloudWiki
跳转至: 导航搜索

Auto8-1.png


配置调度器

调度器的作用

调度器的主循环其实就是反复检查是否有到期需要执行的任务,分以下两步进行。

(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