解决 flask_apscheduler 函数执行两次的问题

2,274 阅读1分钟

问题描述:最近在尝试 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.