我直接通过解释器启动我的 Flask 应用程序。
if __name__ == '__main__':
t = Thread(target=run_schedule)
t.start()
context = ('cert.pem', 'key.pem')
app.run(host='0.0.0.0',port=8080,debug=False,ssl_context=context)
run_schedule
函数永远循环,偶尔解锁以执行任务。
显然,当我不再调试时,我应该使用像gunicorn这样的wsgi服务器,但它不会通过
main()
调用模块,因此线程不会启动。
将它们放在该块之外是行不通的,因为如果任何其他代码导入该模块,线程就会启动!
@before_first_request
几乎就是我所需要的,但是它需要我先用请求戳服务器。不理想。
推荐的方法是什么? (或者后台线程是否违背了 wsgi 哲学?)
您不应该在服务器应用程序中生成后台线程。例如,一个 WSGI 服务器可能会生成多个服务器应用程序,然后您就有多个后台线程。相反,请查看 cronjobs 或 job 队列,如 Celery。
如果你愿意,你可以这样做。你可能想要这样做,因为 Cron 工作可能很脆弱,而 Celery 可能会杀伤力过大。
在应用程序文件夹中创建一个文件,例如 production.py,如下所示:
from . import app, start_background
start_background()
现在像这样调用 Gunicorn:
gunicorn --workers=1 --threads=4 app.production:app
只要你将workers设置为1,你就应该只得到一个后台任务。