1、安装APScheduler
1.1 pip 安装
首选的安装方法是使用pip
$ pip install apscheduler
1.2 源码安装
$ python setup.py install
2、代码示例
源代码分发包含的 examples
目录中可以找到许多以不同方式使用APScheduler的任务示例。
https://github.com/agronholm/apscheduler/tree/master/examples/?at=master
3、基本概念
3.1 触发器:triggers
包含调度的逻辑。每项任务都有自己的触发器,它决定了接下来应该运行的任务。除了最初的配置之外,触发器是完全无状态的。
3.2 作业存储:job stores
安排预定的任务。默认的作业存储只是将任务保存在内存中,但其他存储在各种数据库中。任务数据在保存到持久性任务存储时被序列化,并在从任务存储加载时反序列化。作业存储(不是默认存储)不会将任务数据保存在内存中,而是作为中间人在后端保存,加载,更新和搜索任务。作业存储绝不能在调度程序之间共享。
3.3 执行器:executors
是处理任务运行的东西。他们通常通过将任务中指定的可调用对象提交给线程或进程池来完成此操作。任务完成后,执行程序通知调度程序,然后发出适当的事件。
3.4 调度器:schedulers
将其余的组合在一起。您通常只有一个调度程序在您的应用程序中运行。应用程序开发人员通常不直接处理任务存储,执行程序或触发器。相反,调度程序提供了适当的接口来处理所有这些。配置任务存储和执行程序是通过调度程序完成的,就像添加,修改和删除任务一样。
4、如何选择?
如何选择正确(合适)的调度器,作业存储,执行器和触发器?
调度程序的选择主要取决于编程环境以及使用APScheduler进行的操作。以下是选择调度程序的快速指南:
调度方式 | 备注 | |
---|---|---|
BlockingScheduler | 仅可用在当前你的进程之内,与当前的进行共享计算资源 | |
BackgroundScheduler | 在后台运行调度,不影响当前的系统计算运行 | |
AsyncIOScheduler | 如果当前系统中使用了async module,则需要使用异步的调度器 | |
GeventScheduler | 如果使用了gevent,则需要使用该调度 | |
TornadoScheduler | 如果使用了Tornado, 则使用当前的调度器 | |
TwistedScheduler | Twister应用的调度器 | |
QtScheduler | Qt的调度器 |
要选择适当的任务存储,您需要确定是否需要任务持久化。如果您始终在应用程序开始时重新创建任务,则可以使用默认值(MemoryJobStore
)。但是,如果您需要自己的任务坚持调度程序重新启动或应用程序崩溃,那么您的选择通常归结为编程环境中使用的工具。但是,如果你在位置自由选择,然后SQLAlchemyJobStore
在 PostgreSQL的后端是推荐的选择,因为它强大的数据完整性保护。
同样,如果您使用上述框架之一,则通常会为您选择执行器。否则, ThreadPoolExecutor
对于大多数目的而言,默认值应该足够好。如果您的任务负载涉及CPU密集型操作,则应考虑使用ProcessPoolExecutor
多个CPU内核。您甚至可以同时使用这两种方法,将进程池执行程序添加为辅助执行程序。
当您安排任务时,您需要为其选择一个触发器
,确定任务运行时计算日期/时间的逻辑。
4.1 三种内置触发器
4.1.1 date
-
在某个特定时间只运行一次时使用
参数 | 类型 | 备注 |
---|---|---|
run_date | datetime|str | the date/time to run the job at |
timezone | datetime.tzinfo|str | time zone for run_date if it doesn’t have one already |
-
date 样例
# The job will be executed on November 6th, 2009
sched.add_job(my_job, 'date', run_date=date(2009, 11, 6), args=['text'])
# The job will be executed on Nove