3

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

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

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

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

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

如何在不阻塞的情况下监听 celery 事件?

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

4

1 回答 1

2

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

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

于 2013-08-23T11:01:07.217 回答