Apscheduler配置异常:设5分钟间隔却按1分钟执行并报错
问题分析与解决
你的代码本身逻辑是正确的,但出现的问题大概率是代码被重复执行/多次启动了调度器实例,结合日志里的code reload提示,推测是自动重载工具(比如调试模式下的热重载)导致的:
- 间隔显示为1分钟的原因:自动重载会多次执行你的代码,每次都会创建新的
BlockingScheduler实例并添加任务。多个调度器同时运行,任务触发频率叠加,看起来就变成了1分钟一次。 - “达到最大运行实例数”的原因:APScheduler默认每个任务只允许1个实例运行,当多个调度器同时触发同一个任务时,新的任务实例会因为旧实例还在运行(或者多个调度器的任务冲突)而被跳过。
解决步骤
1. 避免代码重复执行
给你的入口代码加上if __name__ == "__main__":判断,这能防止模块被导入或自动重载时重复执行main函数:
from apscheduler.schedulers.blocking import BlockingScheduler def timeJob(): print("some job done") def main(): timeJob() scheduler = BlockingScheduler() scheduler.add_job(timeJob, 'interval', minutes=5) scheduler.start() # 新增判断,仅当直接运行脚本时才执行main if __name__ == "__main__": main()
2. 关闭自动重载功能
如果是用Flask、Django等框架的调试模式导致的自动重载,建议关闭调试模式,或者使用专门的生产环境启动方式,避免频繁重载创建多个调度器实例。
3. 清理残留进程
手动结束所有相关的Python进程后再重新运行代码,确保后台没有残留的旧调度器实例在运行。
4. 验证单独运行
先单独运行修改后的代码,观察日志是否正常:
- 正常情况下,日志会显示任务间隔为
interval[0:05:00] - 不会再出现“达到最大运行实例数”的报错
内容的提问来源于stack exchange,提问作者Massimo Manca
相关产品推荐
相关产品推荐

