APScheduler:高级定时任务框架详解
请介绍APScheduler(Advanced Python Scheduler)的架构(触发器/作业存储/执行器/调度器)、三种触发器类型(date/interval/cron)、以及作业存储(内存/SQLite/Redis/MongoDB)。给出一个用APScheduler实现定时任务的完整示例。
回答
我是大山
APScheduler架构
四个核心组件:
- 触发器(Trigger):决定作业何时执行
- 作业存储(Job Store):持久化作业状态
- 执行器(Executor):在线程/进程池中执行作业
- 调度器(Scheduler):协调上述组件
三种触发器
from apscheduler.schedulers.background import BackgroundScheduler
from apscheduler.triggers.date import DateTrigger
from apscheduler.triggers.interval import IntervalTrigger
from apscheduler.triggers.cron import CronTrigger
scheduler = BackgroundScheduler()
# 1. DateTrigger — 指定时间执行一次
scheduler.add_job(
func=my_job,
trigger=DateTrigger(run_date='2026-06-01 10:00:00'),
id='once'
)
# 2. IntervalTrigger — 间隔执行
scheduler.add_job(
func=my_job,
trigger=IntervalTrigger(minutes=30),
id='interval',
replace_existing=True
)
# 3. CronTrigger — 类似crontab
scheduler.add_job(
func=my_job,
trigger=CronTrigger(
day_of_week='mon-fri',
hour=9,
minute=30
),
id='cron'
)
scheduler.start()
作业存储
| 存储类型 | 持久化 | 适用场景 |
|---|---|---|
MemoryJobStore | 不持久化 | 开发测试 |
SQLAlchemyJobStore | SQLite/MySQL/PostgreSQL | 中等规模 |
MongoDBJobStore | MongoDB | 高可用分布式 |
RedisJobStore | Redis | 高性能内存 |
完整示例
from apscheduler.schedulers.background import BackgroundScheduler
from apscheduler.triggers.cron import CronTrigger
import logging
logging.basicConfig(level=logging.INFO)
def daily_report():
print('生成日报...')
scheduler = BackgroundScheduler()
scheduler.add_job(
daily_report,
CronTrigger(hour=8, minute=0),
id='daily_report',
misfire_grace_time=300 # 错过执行后5分钟内补执行
)
scheduler.start()
try:
while True:
pass
except KeyboardInterrupt:
scheduler.shutdown()
注意: APScheduler不是生产级分布式调度器(无Leader选举),分布式场景考虑Celery Beat。