Gunicorn 多个烧瓶工人和绑定任务 celery

Posted

技术标签:

【中文标题】Gunicorn 多个烧瓶工人和绑定任务 celery【英文标题】:Gunicorn multiple flask workers and bound tasks celery 【发布时间】:2020-12-28 14:19:41 【问题描述】:

按照this guide(复杂示例:显示状态更新和结果部分)我有 2 个烧瓶端点用于启动绑定任务(POST 请求)并通过其 id 检索任务结果(GET 请求到/status/)。

在一个 shell 中以 flask run 和在另一个 shell 中以 celery worker -A app.celery -l info 运行烧瓶应用程序,可以运行任务,然后通过对 /status/ 端点的 GET 请求获取其结果。

添加 gunicorn 并将 worker 数量设置为 3 后,POST 请求运行正常,但获取特定运行任务的状态是一个问题,因为它无法获取任务(task.info 为 None)。有机会通过此状态端点获取任务结果,但如果我正确理解问题,它取决于哪个烧瓶实例 gunicorn 将请求重定向到。

我没有设置任何特定的 celery 设置,只有 broker 和 result_backend(使用 RabbitMQ)。

如何正确配置 gunicorn+flask+celery 来完成这类任务?

【问题讨论】:

【参考方案1】:

已通过使用 redis 作为结果后端(或除 RPC 之外的任何其他方式,我相信)来修复。

根据documentation

RPC 结果后端 (rpc://) 很特殊,因为它实际上并不存储状态,而是将它们作为消息发送。这是一个重要的区别,因为这意味着结果只能检索一次,并且只能由启动任务的客户端检索。两个不同的进程不能等待相同的结果。

【讨论】:

以上是关于Gunicorn 多个烧瓶工人和绑定任务 celery的主要内容,如果未能解决你的问题,请参考以下文章

为啥在 gunicorn 上运行的烧瓶应用程序中使用日志轮换时同时在多个文件上写入日志?

Gunicorn 与多个工人:有没有一种简单的方法可以只执行一次某些代码?

使用 nginx 和 gunicorn 运行烧瓶应用程序

在烧瓶/gunicorn 中初始化应用程序的位置

无法在 gunicorn wsgi 服务器上运行烧瓶应用程序

gunicorn 不能与一个以上的工人一起运行