Python中任务调度模块APScheduler
Python中任务调度模块APScheduler
APScheduler(Advanced Python Scheduler)是一个功能强大的Python定时任务框架,基于Quartz设计理念,提供了灵活的任务调度功能,支持基于日期、固定时间间隔以及crontab类型的任务调度,并且可以持久化任务。
1. 安装APScheduler
1 | # 安装最新版本 |
2. 基本架构
APScheduler由四个核心组件组成:
触发器(Triggers):定义任务触发的条件
- 描述任务何时被触发,支持按日期、时间间隔或cron表达式三种方式
任务存储器(Job Stores):存放任务
- 可以存储在内存(默认)或数据库中
- 注意:调度器之间不能共享任务存储器
执行器(Executors):用于执行任务
- 将任务提交到线程池或进程池中运行
- 任务完成后通知调度器触发相应的事件
调度器(Schedulers):协调三个组件的运行
- 根据配置将触发器、任务存储器和执行器组合在一起
3. 调度器类型
3.1 BlockingScheduler
阻塞式调度器,适用于作为独立进程运行的情况:
1 | from apscheduler.schedulers.blocking import BlockingScheduler |
3.2 BackgroundScheduler
后台调度器,适用于在应用程序后台运行:
1 | from apscheduler.schedulers.background import BackgroundScheduler |
3.3 其他调度器
- AsyncIOScheduler:适用于使用asyncio的异步应用
- GeventScheduler:适用于使用Gevent的应用
- TornadoScheduler:适用于Tornado应用
- TwistedScheduler:适用于Twisted应用
- QtScheduler:适用于Qt应用
4. 触发器类型
4.1 date触发器
在指定的日期和时间执行一次:
1 | from apscheduler.schedulers.background import BackgroundScheduler |
4.2 interval触发器
按照固定的时间间隔重复执行:
1 | from apscheduler.schedulers.background import BackgroundScheduler |
4.3 cron触发器
按照cron表达式执行任务,功能最强大:
1 | from apscheduler.schedulers.background import BackgroundScheduler |
4.4 cron表达式详解
| 表达式 | 描述 | 示例 |
|---|---|---|
* |
通配符,匹配所有值 | minutes=* 每分钟触发 |
*/a |
可被a整除的通配符 | minutes=*/5 每5分钟触发 |
a-b |
范围a-b触发 | hours=9-17 9点到17点之间每小时触发 |
a-b/c |
范围a-b,且可被c整除时触发 | minutes=0-30/10 0-30分钟内每10分钟触发 |
xth y |
第几个星期几触发 | day='1st mon' 每个月第一个周一 |
last x |
一个月中最后一个星期几触发 | day='last fri' 每个月最后一个周五 |
last |
一个月最后一天触发 | day='last' 每个月最后一天 |
x,y,z |
组合表达式 | hours='9,12,18' 9点、12点、18点触发 |
5. 任务存储配置
5.1 内存存储(默认)
1 | from apscheduler.schedulers.background import BackgroundScheduler |
5.2 数据库存储
1 | from apscheduler.schedulers.background import BackgroundScheduler |
6. 执行器配置
1 | from apscheduler.schedulers.background import BackgroundScheduler |
7. 任务管理
7.1 添加任务
1 | # 方法1:add_job() |
7.2 修改任务
1 | # 修改任务的触发时间 |
7.3 获取任务列表
1 | # 获取所有任务 |
8. 错误处理
1 | from apscheduler.schedulers.background import BackgroundScheduler |
9. 最佳实践
9.1 配置示例
1 | from apscheduler.schedulers.background import BackgroundScheduler |
9.2 注意事项
- 避免任务执行时间过长:如果任务执行时间超过触发间隔,可能会导致任务堆积
- 合理设置max_instances:根据任务性质设置合适的并发实例数
- 使用持久化存储:对于重要任务,使用数据库存储以防止进程重启后任务丢失
- 错误处理:添加错误监听器,及时发现和处理任务执行失败的情况
- 资源管理:根据任务类型选择合适的执行器(线程池或进程池)
- 调度器关闭:在应用程序退出前,调用
scheduler.shutdown()关闭调度器
10. 实际应用示例
10.1 定时数据备份
1 | import os |
10.2 定时API调用
1 | import requests |