我有一个 Flask 网络应用程序,并且有一些任务需要长时间运行(> 1 分钟)。我想从烧瓶中卸载这些(阻塞网络服务器等)并将它们移动到外部任务中。我安装了 Celery,并且能够从 Flask 运行这些任务。好的。
为了在任务完成时通知用户并返回结果,我想使用网络套接字。这就是困难的地方。
我有一个运行我的客户端连接到的 gevent websocket 服务器。当我启动 celery 任务时,我传入客户端的会话 ID,这样当我得到结果时,我就知道它们属于谁。
现在我需要 websocket 服务器知道这些任务何时完成,查看结果,并将它们发送到适当的连接。
如何?这是我完全迷失的地方。我可以用 监听 celery 事件celery.events.EventListener.capture
,但这会阻塞我的 websocket 服务器,所以我不能有多个连接!
如何在不阻塞的情况下监听 celery 事件?
一个想法是通过网络套接字发出请求,然后从我的网络套接字服务器启动 celery 任务。这将解决通知问题(仅使用 celery 事件),但我仍然对我的原始问题感到好奇,请求是在哪里向我的标准烧瓶服务器发出的。