解决 gunicorn 运行 flask app 时 apscheduler 任务不运行的问题
使用 Flask 做应用时,用了 Apscheduler
作为后台任务及定时任务执行器,使用方式类似于 1
2
3
4
5
6
7
8
9from 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
9from 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()
还是要放在判断中的,只在调试模式下运行。