故障表现

配置的是每小时执行一次,实际日志里同一分钟出现两条执行记录,数据被重复处理。

问题出在哪

常见原因是 Web 服务以多进程方式启动,每个 worker 都初始化了一份调度器,或者 CronTrigger 与 IntervalTrigger 同时注册。判断时先分清是 APScheduler 重复执行 本身的配置问题,还是上游调用、运行环境带进来的差异;前者改配置就能收口,后者要沿着请求链路一层层往上找,处理顺序不能颠倒。先在出问题的机器上复现一次,把报错原文和发生时间记下来,再对着日志定位。

按这个顺序处理

  1. 确认进程数,调度器只在一个进程里启动
  2. 检查任务是否被重复 add_job
  3. 给任务加唯一 id 避免覆盖失败

对应的命令或配置片段如下,可直接复制:

from apscheduler.schedulers.background import BackgroundScheduler
sched = BackgroundScheduler(timezone='Asia/Shanghai')
sched.add_job(job, 'cron', minute=5, id='hourly_job', replace_existing=True)
sched.start()

改完只在一台机器上验证不够,至少从外网和移动网络各试一次,才能确认不是本地缓存造成的假象。不要一次改多个参数,每次只动一处并记录下来,否则现象变了也说不清是哪个改动起的作用。

怎么确认改好了

观察两小时日志,每个时间点只有一条执行记录,任务表里也没有重复 id。

作者 9823189