我有一个Flask网络应用程序,有些任务长期运行(> 1分钟)。我想从烧瓶中卸载这些(阻止Web服务器等)并将它们移动到外部任务中。我得到了Celery设置,能够从Flask运行这些任务。好。
要在完成任务时通知用户并返回结果,我想使用Web套接字。这是它变得艰难的地方。
我有一个运行我的客户端连接的gevent websocket服务器。当我启动芹菜任务时,我会传递客户端的会话ID,这样当我得到我的结果时,我知道他们属于谁。
现在我需要websocket服务器知道这些任务何时完成,查看结果,并将它们发送到适当的连接。
如何?这是我完全迷失的地方。我可以用celery.events.EventListener.capture
监听芹菜事件,但这会阻止我的websocket服务器,所以我不能有多个连接!
如何在不阻止的情况下收听芹菜事件?
一个想法是通过Web套接字发出请求,然后从我的websocket服务器启动celery任务。这将解决通知问题(仅使用芹菜事件),但我仍然对我的原始问题感到好奇,其中请求是我的标准烧瓶服务器。
答案 0 :(得分:1)
你需要你的烧瓶应用程序不要阻止捕获呼叫。 一种解决方案是使用gevent或eventlet运行flask,以便您的进程将异步处理请求,阻塞调用不会阻止该进程。
有很多例子,名称为:https://gist.github.com/lrvick/1185629