我有一个Flask Web应用程序,其中一些任务需要长时间运行(> 1分钟)。 我想把它们从Flask(阻塞Web服务器等)中分离出来,转移到外部任务中。我已经安装了Celery并能够从Flask运行这些任务。很好。
为了在任务完成时通知用户并返回结果,我想使用Web套接字。 这就是困难的地方。
我有一个gevent WebSocket服务器在运行,我的客户端连接到它。当我启动celery任务时,我传递客户端的会话ID,以便在获得结果时,我知道它们属于谁。
现在,我需要WebSocket服务器知道这些任务何时完成,查看结果,并将它们发送到适当的连接。
怎么做?这就是我完全迷失的地方。我可以使用celery.events.EventListener.capture监听celery事件,但这会阻止我的WebSocket服务器,因此无法有多个连接!
如何在不阻止的情况下监听celery事件?
一个想法是通过Web套接字发出请求,然后从我的WebSocket服务器启动celery任务。那样可以解决通知问题(只需使用celery事件),但我仍然对最初的问题感到好奇,即请求是由我的标准Flask服务器发出的。
为了在任务完成时通知用户并返回结果,我想使用Web套接字。 这就是困难的地方。
我有一个gevent WebSocket服务器在运行,我的客户端连接到它。当我启动celery任务时,我传递客户端的会话ID,以便在获得结果时,我知道它们属于谁。
现在,我需要WebSocket服务器知道这些任务何时完成,查看结果,并将它们发送到适当的连接。
怎么做?这就是我完全迷失的地方。我可以使用celery.events.EventListener.capture监听celery事件,但这会阻止我的WebSocket服务器,因此无法有多个连接!
如何在不阻止的情况下监听celery事件?
一个想法是通过Web套接字发出请求,然后从我的WebSocket服务器启动celery任务。那样可以解决通知问题(只需使用celery事件),但我仍然对最初的问题感到好奇,即请求是由我的标准Flask服务器发出的。