Celery + RabbitMQ结果后端 + WebSockets?

3
我有一个Flask Web应用程序,其中一些任务需要长时间运行(> 1分钟)。 我想把它们从Flask(阻塞Web服务器等)中分离出来,转移到外部任务中。我已经安装了Celery并能够从Flask运行这些任务。很好。
为了在任务完成时通知用户并返回结果,我想使用Web套接字。 这就是困难的地方。
我有一个gevent WebSocket服务器在运行,我的客户端连接到它。当我启动celery任务时,我传递客户端的会话ID,以便在获得结果时,我知道它们属于谁。
现在,我需要WebSocket服务器知道这些任务何时完成,查看结果,并将它们发送到适当的连接。
怎么做?这就是我完全迷失的地方。我可以使用celery.events.EventListener.capture监听celery事件,但这会阻止我的WebSocket服务器,因此无法有多个连接!
如何在不阻止的情况下监听celery事件?
一个想法是通过Web套接字发出请求,然后从我的WebSocket服务器启动celery任务。那样可以解决通知问题(只需使用celery事件),但我仍然对最初的问题感到好奇,即请求是由我的标准Flask服务器发出的。
1个回答

2

您需要确保flask应用程序不会在捕获调用时被阻止。

一种解决方案是使用gevent或eventlet运行flask,以便您的进程将异步处理请求并且阻塞调用不会阻塞该进程。

有大量关于此的示例,其中一个是: https://gist.github.com/lrvick/1185629


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接