Celery + RabbitMQ结果后端+ WebSockets?

时间:2013-08-07 20:18:49

标签: python rabbitmq celery gevent

我有一个Flask网络应用程序,有些任务长期运行(> 1分钟)。我想从烧瓶中卸载这些(阻止Web服务器等)并将它们移动到外部任务中。我得到了Celery设置,能够从Flask运行这些任务。好。

要在完成任务时通知用户并返回结果,我想使用Web套接字。这是它变得艰难的地方。

我有一个运行我的客户端连接的gevent websocket服务器。当我启动芹菜任务时,我会传递客户端的会话ID,这样当我得到我的结果时,我知道他们属于谁。

现在我需要websocket服务器知道这些任务何时完成,查看结果,并将它们发送到适当的连接。

如何?这是我完全迷失的地方。我可以用celery.events.EventListener.capture监听芹菜事件,但这会阻止我的websocket服务器,所以我不能有多个连接!

如何在不阻止的情况下收听芹菜事件?

一个想法是通过Web套接字发出请求,然后从我的websocket服务器启动celery任务。这将解决通知问题(仅使用芹菜事件),但我仍然对我的原始问题感到好奇,其中请求是我的标准烧瓶服务器。

1 个答案:

答案 0 :(得分:1)

你需要你的烧瓶应用程序不要阻止捕获呼叫。 一种解决方案是使用gevent或eventlet运行flask,以便您的进程将异步处理请求,阻塞调用不会阻止该进程。

有很多例子,名称为:https://gist.github.com/lrvick/1185629