在业务开发中,定时任务总是绕不开的话题。许多时候,crontab和一些轻量级的定时库,功能总是不够强大,无法满足业务场景需求。不妨来看一看 APScheduler,这个强大的Python定时任务库,一定能让你满意。
简介
APScheduler,是 agronholm 在Github上开源的Python定时库,项目位于 https://github.com/agronholm/apscheduler,目前版本为 v3.6.3。APScheduler功能强大,支持单次时间点、固定时间间隔,和cron定期任务这三种方式的定时任务,支持使用内存、数据库和Redis等存储后端进行定时任务的上下文和参数的存储,支持使用包括线程池和进程池等执行方式,支持包括阻塞、后台、AsyncIO等调度方式。APScheduler能够满足几乎所有的定时任务需求。
安装
APScheduler 可以直接使用 pip 进行安装:
pip install apscheduler
如果需要使用持久化的存储后端,则需要安装对应的库,如SQLAlchemy等。
示例
APScheduler包括以下4种部件:
- triggers:触发器,包括date、interval和cron三种方式;
- job stores:任务存储后端,包括内存、SQLAlchemy、MongoDB等;
- executors:执行器,包括线程池和进程池等;
- schedulers:调度器,包括阻塞、后台和Gevent等。
我们来看一个使用例子:
from pytz import utcfrom apscheduler.schedulers.background import BackgroundSchedulerfrom apscheduler.jobstores.mongodb import MongoDBJobStorefrom apscheduler.jobstores.sqlalchemy import SQLAlchemyJobStorefrom apscheduler.executors.pool import ThreadPoolExecutor, ProcessPoolExecutorjobstores = { 'mongo': MongoDBJobStore(), 'default': SQLAlchemyJobStore(url='sqlite:///jobs.sqlite')}executors = { 'default': ThreadPoolExecutor(20), 'processpool': ProcessPoolExecutor(5)}job_defaults = { 'coalesce': False, 'max_instances': 3}scheduler = BackgroundScheduler(jobstores=jobstores, executors=executors, job_defaults=job_defaults, timezone=utc)
我们分别进行了jobstores、executors的配置,然后进行了调度器的实例化。
启动调度器,使用start()接口:
scheduler.start()
添加任务,有两种方式,包括:
- 使用add_job接口
job = scheduler.add_job(myfunc, 'interval', minutes=2)job2 = scheduler.add_job(say_hello, 'date', run_date=tomorrow, args=['hello'])
- 使用scheduled_job()装饰器装饰任务函数
我们也可以移除任务,使用remove_job()接口和ID进行移除,或对于任务实例调用remove()接口。
我们还可以进行任务的暂停和恢复,分别使用pause()和resume()接口。
总结
APScheduler功能强大,其多样的配置方式使其能够适应不同的应用场景。对比标准库在内的其他轻量级定时库,APScheduler功能丰富,稳定可靠;而对比如Celery等以独立服务方式进行定时调度的框架而言,APScheduler使用简单,部署方便,容易管理。
APScheduler项目目前处于稳定维护状态,项目代码结构清晰,代码质量较高,是一个值得学习的Python工具库。