解决 gunicorn 运行 flask app 时 apscheduler 任务不运行的问题

使用 Flask 做应用时,用了 Apscheduler 作为后台任务及定时任务执行器,使用方式类似于

1
2
3
4
5
6
7
8
9
from flask import Flask
from apscheduler.schedulers.background import BackgroundScheduler

app = Flask(__name__)
scheduler = BackgroundScheduler()

if __name__ == '__main__':
scheduler.run()
app.run(debug=True)

在调试时,直接用 python3 app.py 运行,一切正常。但是在使用 gunicorn 切换到生产环境时,使用 gunicorn -w 1 -b 0.0.0.0:5000 app:app 时,却出现了 apscheduler 的后台任务不运行的情况;

直接运行 python3 app.py 自然是以顺序执行,并且程序的 __name____main__,自然 scheduler.run()app.run() 会正常执行;但经过查阅资料和接口文档得知,gunicorn 是将 app:app 即 app.py 中的 app 对象(Flask 实例)作为入口的,而此时程序的 __name__app,因此 scheduler.run() 直接就不执行了。

所以,对于单进程(多线程)的任务,直接将 scheduler.run() 放在 __name__ 判断条件外,就能正常执行了:

1
2
3
4
5
6
7
8
9
from flask import Flask
from apscheduler.schedulers.background import BackgroundScheduler

app = Flask(__name__)
scheduler = BackgroundScheduler()
scheduler.run()

if __name__ == '__main__':
app.run(debug=True)

当然 app.run() 还是要放在判断中的,只在调试模式下运行。