APScheduler是适合中低频非分布式场景的轻量级Python定时任务库,支持Blocking、Background和AsyncIOScheduler三种调度器,提供interval、cron、date触发器及SQLAlchemy/Redis持久化。

用 APScheduler 实现轻量级定时任务调度
APScheduler(Advanced Python Scheduler)是最常用的 Python 定时任务库,适合中低频、非分布式场景。它支持内存、SQLAlchemy、Redis 等多种作业存储后端,且不依赖外部服务。
核心要点:
- 三种常用调度器类型:BlockingScheduler(主线程阻塞,适合单脚本)、BackgroundScheduler(后台线程,适合 Web 应用集成)、AsyncIOScheduler(适配 asyncio)
- 触发器灵活:interval(间隔执行)、cron(类 Linux cron 表达式)、date(仅执行一次)
- 任务可持久化:搭配 SQLAlchemy 或 Redis 后端,重启后未执行的任务不会丢失
示例:每 5 秒打印时间,使用 BackgroundScheduler 避免阻塞主程序:
from apscheduler.schedulers.background import BackgroundScheduler
from apscheduler.triggers.interval import IntervalTrigger
import time
def job_func():
print("执行任务:", time.strftime("%Y-%m-%d %H:%M:%S"))
scheduler = BackgroundScheduler()
scheduler.add_job(job_func, trigger=IntervalTrigger(seconds=5))
scheduler.start()
try:
while True:
time.sleep(1)
except KeyboardInterrupt:
scheduler.shutdown()
结合 Flask/FastAPI 的定时任务集成
Web 框架中启动定时任务需注意生命周期管理,避免重复加载或进程 fork 导致多实例运行。
立即学习“Python免费学习笔记(深入)”;
关键实践:
-
只在主进程初始化:Flask 使用
app.config['WERKZEUG_RUN_MAIN']判断;FastAPI 可配合lifespan事件 -
避免 Gunicorn 多 worker 冲突:设置
--preload并在启动时加锁,或改用单 worker + 后台线程方式 -
提供简单管理接口:如
/api/jobs查看任务列表,/api/jobs/pause控制启停(需启用jobstore和executors)
高可靠场景:Celery + Redis/RabbitMQ 分布式调度
当任务耗时长、需失败重试、跨机器执行或要求高可用时,Celery 是更合适的选择。它本身不内置定时能力,需配合 celery beat 使用。
配置要点:
-
beat 调度器单独运行:作为独立进程读取
CELERY_BEAT_SCHEDULE,将定时任务转为普通任务发往 broker - broker 推荐 Redis 或 RabbitMQ:Redis 轻量易部署,RabbitMQ 更适合企业级消息保障
- 启用任务结果后端:如 Redis,便于查询执行状态、重试或链式调用
示例片段(celeryconfig.py):
from celery import Celery
from datetime import timedelta
app = Celery('tasks', broker='redis://localhost:6379/0')
app.conf.beat_schedule = {
'daily-report': {
'task': 'tasks.send_daily_report',
'schedule': timedelta(hours=24),
'args': ('admin@example.com',)
},
}
app.conf.timezone = 'Asia/Shanghai'
自研简易调度器:适合学习与极简需求
若只想理解原理或项目极度受限(如无第三方包权限),可用标准库实现最小可行调度器。
核心逻辑:
- 用
threading.Timer或asyncio.create_task+asyncio.sleep实现延迟触发 - 维护一个任务列表,每个任务含函数、下次执行时间、周期等字段
- 主循环定期检查,触发到期任务并重置下一次时间(注意线程安全)
注意:不推荐用于生产环境——缺乏错误隔离、无持久化、难监控、无法动态增删任务。










