最新在了解python作业调度的相关知识,我们知道可以用scheduler, APScheduler,Celery。今天的重点是APScheduler(以下简称APS),查看资料发现关于该库的资料挺少的。所以就打算把APS的官方网站用户指南(最新版3.x.x、网上多比较旧,停留在2.x.x)翻译一遍。翻译之后,如果时间充裕,将介绍如何在django使用APS,以及APS的一些高级用法。
本文的主要内容如下:
安装指南
安装方法推荐使用pip:
$ pip install apscheduler
如果由于某种原因,pip不起作用,您可以从PyPI 手动下载APScheduler发行版解压缩。然后安装它:
$ python setup.py install
代码示例
源代码分发包含一个examples
目录,可以在其中找到许多以不同方式使用APScheduler的工作示例。这些示例也可以 在线浏览。
基本概念
触发器(Triggers),包含调度逻辑。每个作业都拥有一个触发器来决定这个作业下次执行的时间。除了初始配置之外,触发器完全是无状态的。
作业仓库(Job stores),存储调度作业。默认将作业存储内存,也可以使用各种类型数据库进行存储。当持久化存储时,调度作业数据将会被序列化,加载时会被反序列化。持久化存储时不会将调度作业数据保存在内存中,在使用时通过增删改查来处理调度作业数据。作业仓库不得在不同的调度器之间共享。
处理器(Executors),处理正在运行的作业,他们通常通过将作业中指定的可调用内容提交给线程或进程池来完成此操作。作业完成后,执行程序会通知调度程序,调度程序随后会发出相应的事件。
调度器(Schedulers),粘合上述组件,在应用程序中只需要有一个调度器。开发人员通常不需要直接调用触发器、处理器、作业仓库的接口。调度器提供了合适的接口用于调用。调度器自身完成作业仓库、处理器的配置,增删改查。
选择合适的调度器、作业仓库、处理器和触发器
选择的原则取决于实际的开发环境和作业调度需求,调度器主要有以下几类:
BlockingScheduler: 适用于进程只使用此调度器
BackgroundScheduler:适用于非下面的应用框架中,并且想调度器在应用程序后台执行
AsyncIOScheduler:适用于IO同步模块
GeventScheduler:适用于应用程序使用Gevent(Python的第三方协程库)
TornadoScheduler:适用于Tornado应用
TwistedScheduler:适用于Twisted应用
QtScheduler:适用于Qt应用
作业仓库的选择取决于是否需要持久化存储作业数据。如果你想每次启动服务时重新创建作业,那么可以选择默认仓库,也就是内存存储。但是,如果是调度程序重新启动或应用程序崩溃,仍希望保存作业以便环境恢复时继续使用,那么只需要考虑你所在的编程环境中使用哪个存储仓库。可以自由选择,推荐使用SQLAlchemyJobStore以及对应的仓库PostgreSQL,因为它数据完整性保护功能十分强大。
同样的,处理器的选择取决于你使用上面的那种框架,框架会自动选择处理器。不同的是,ThreadPoolExecutor可以满足大多数情况。如果您的作业负载涉及CPU密集型操作,则应考虑使用ProcessPoolExecutor
。同时使用两者也是可以的,只需要将进程池执行程序添加为辅助执行程序。
当调度一个作业时,需要选择一个触发器。触发器决定了作业在哪个时间点将会被执行。APScheduler自建了三种触发器:
date:在某个确定的时间点执行作业
interval:每隔某个固定周期执行作业
cron:在一天的某个时间定期执行作业
也可以将多个触发器组合成一个触发器,更多信息查看 combining triggers
.
你可以在作业仓库、处理器、触发器的API文档中找到与他们相关的插件。
下一篇:配置调度器