问题描述:最近在尝试 flask_apscheduler 的时候遇到job被执行两次的情况, 代码如下:
JOBS = [
{ # 第一个任务,每隔5S执行一次
'id': 'job1',
'func': '__main__:my_job', # 方法名
'trigger': 'interval', # interval表示循环任务
'seconds': 5,
}
]
...
import time
def my_job():
print time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))
...
from flask_apscheduler import APScheduler
scheduler = APScheduler()
scheduler.init_app(app)
scheduler.start()
"""
output:
2019-08-16 11:05:15
2019-08-16 11:05:16
2019-08-16 11:05:20
2019-08-16 11:05:21
"""
原因:Werkzeug是在调用 app.run() 时为Flask提供部署服务的lib。Werkzeug的reloader方法会生成子进程,这样每次代码更改都可以重新启动该进程。
查看源码 restart_with_reloader() 方法就知道,subprocess.call() 会调用函数两次。
可以在app.run()中设置use_reloader=False,这样就可以避免函数被执行两次。
老外在Stack Overflow有相关解答。why-does-running-the-flask-dev-server-run-itself-twice.