我有一个flask
应用程序,我有很多长时间运行的异步任务(〜小时)。这些任务的状态与客户沟通非常重要。
我使用celery
来管理后台任务队列,我正在尝试通过socketIO
从每个后台线程向客户端广播更新。这可能吗?是否有更好的策略来实现我想要的目标?
答案 0 :(得分:4)
您没有说,但我假设您打算使用Flask-SocketIO来处理服务器端SocketIO而不是官方Node.js服务器,对吗?
您可以做什么,但使用当前版本的Flask-SocketIO,问题是托管Flask和Flask-SocketIO服务器的进程拥有与客户端的套接字连接,因此它是唯一的可以与他们沟通的过程。目前,Flask-SocketIO在从Celery工作者等其他进程向客户端发送数据方面没有任何帮助,这部分您必须自己实现。特别是对于Celery,您可以让您的长时间运行任务公开服务器进程可以获取并发送给客户端的进度信息。
我目前正在改进Flask-SocketIO,它将使任何进程能够使用Redis发布/订阅后端向连接的客户端发送消息,以便与Flask-SocketIO服务器进行通信。完成此工作后,您将能够从Celery进程透明地向任何客户端写入数据。
您还会问是否还有其他选择。您还应该考虑客户端可以轮询服务器的状态。如果更新不需要非常频繁,那么这是一个更容易实现的选项。客户端向服务器询问给定任务的状态,然后服务器依次询问Celery任务。我在Flask+Celery blog article中展示了这种方法。
答案 1 :(得分:0)
我能够通过在 Flask 服务器上创建端点来解决这个问题。详情见my answer here