Celery+RabbitMQ结果后端+WebSockets



我有一个Flask web应用程序,有些任务运行时间很长(>1分钟)。我想从flask(阻塞web服务器等)中卸载这些,并将它们转移到外部任务中。我安装了Celery,能够从Flask运行这些任务。好的

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

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

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

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

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

一个想法是通过web套接字发出请求,然后从我的web套接字服务器启动芹菜任务。这将解决通知问题(只是使用了芹菜事件),但我仍然很好奇我最初的问题是在哪里向我的标准烧瓶服务器发出请求的。

您需要您的flask应用程序不要阻止捕获调用。一种解决方案是使用gevent或eventlet运行flask,这样您的进程将异步处理请求,并且阻塞调用不会阻塞进程。

这方面有很多例子,举一个例子:https://gist.github.com/lrvick/1185629

相关内容

  • 没有找到相关文章

最新更新