Flask中使用APScheduler时函数重复执行两次的解决方法
Flask中APScheduler任务重复执行两次的解决办法
最常见的根源是Flask调试模式的自动重载机制——调试模式下Flask会启动主进程和重载进程两个实例,导致调度器被初始化两次,任务也被重复注册。另外,代码重复导入、多次初始化调度器也会引发这个问题。以下是具体解决方法:
- 关闭调试模式:如果不需要调试功能,启动应用时直接设置
debug=False,避免双进程启动。 - 仅在主进程初始化调度器:利用Flask的环境变量判断主进程,确保调度器只启动一次:
from flask import Flask from apscheduler.schedulers.background import BackgroundScheduler import os app = Flask(__name__) def hello(): print("hello") if __name__ == '__main__': # 仅主进程启动调度器 if not app.debug or os.environ.get('WERKZEUG_RUN_MAIN') == 'true': scheduler = BackgroundScheduler() scheduler.add_job(hello, "cron", id="month", minute="*", hour="*") scheduler.start() app.run(debug=True) - 避免重复注册任务:改用
add_job方法并添加replace_existing=True参数,即使重复添加也会覆盖原有任务,防止重复执行:scheduler.add_job(hello, "cron", id="month", minute="*", hour="*", replace_existing=True) - 检查重复初始化:排查代码中是否在其他模块(如蓝图、工具类)重复创建了
BackgroundScheduler实例并启动,确保全局只有一个调度器实例。
内容的提问来源于stack exchange,提问作者Michael Coleman
相关产品推荐
相关产品推荐

