
096、APScheduler 定时任务:cron 表达式、持久化、分布式锁与 Django 集成一、从一次凌晨报警说起上周三凌晨三点,我被手机震醒——生产环境的定时任务没跑。查日志发现,APScheduler 的 job 在重启后全部丢失,cron 表达式写错了分钟位,导致本该凌晨两点执行的任务跑到了凌晨三点。更坑的是,两台 Django 实例同时触发了同一个任务,数据库里插入了重复数据。这种问题,但凡你用过 APScheduler 超过三个月,大概率都遇到过。今天这篇笔记,我把踩过的坑和解决方案一次性写清楚。二、cron 表达式:别被五个星号骗了APScheduler 的 cron 触发器和 Linux 的 crontab 很像,但细节上有差异。标准格式是:second minute hour day month day_of_week注意,APScheduler 的 cron 比 Linux 多了一个秒位。如果你写0 0 2 * * *,意思是每天凌晨 2 点整执行。但很多人习惯 Linux 的五位写法,直接写0 2 * * *,结果任务每秒都在跑——因为缺少的秒位被当作 0,但 minute 位被解析成了 2,hour 位被解析成了星号,变成了每小时的第 2 分钟执行。这里踩过坑