通过gunicorn启动Flask应用程序时如何启动后台线程?

问题描述 投票:0回答:2

我直接通过解释器启动我的 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 哲学?)

python flask wsgi gunicorn
2个回答
1
投票

您不应该在服务器应用程序中生成后台线程。例如,一个 WSGI 服务器可能会生成多个服务器应用程序,然后您就有多个后台线程。相反,请查看 cronjobsjob 队列,如 Celery


0
投票

如果你愿意,你可以这样做。你可能想要这样做,因为 Cron 工作可能很脆弱,而 Celery 可能会杀伤力过大。

在应用程序文件夹中创建一个文件,例如 production.py,如下所示:

from . import app, start_background
start_background()

现在像这样调用 Gunicorn:

gunicorn --workers=1 --threads=4 app.production:app

只要你将workers设置为1,你就应该只得到一个后台任务。

© www.soinside.com 2019 - 2024. All rights reserved.