我有一个flask应用程序,其中有许多长时间运行的异步任务(~小时)。重要的是,这些任务的状态要与客户端进行通信。
我使用celery来管理后台任务队列,并且我目前正在尝试通过socketIO从每个后台线程向客户端广播更新。这个是可能的吗?有没有更好的策略来实现我想要的?
发布于 2015-11-18 01:57:38
您没有说,但我假设您计划使用Flask-SocketIO来处理服务器端SocketIO,而不是官方的Node.js服务器,对吗?
您想要做的事情是可以完成的,但是使用当前版本的Flask-SocketIO,问题是承载Flask和Flask-SocketIO服务器的进程拥有与客户端的套接字连接,因此它是唯一可以与客户端通信的进程。目前,Flask-SocketIO不提供从其他进程向客户端发送数据的任何帮助,这部分您必须自己实现。特别是对于Celery,您可以让长时间运行的任务公开服务器进程可以获取并发送给客户端的进度信息。
我目前正在改进Flask-SocketIO,这将使任何进程都能够使用Redis pub/sub后端向连接的客户端发送消息,以便与Flask-SocketIO服务器通信。一旦这项工作完成,您将能够透明地从您的Celery进程向任何客户端写入数据。
你还会问是否还有其他选择。您还应该考虑客户端可以轮询服务器的状态。如果更新不需要非常频繁,那么这是一个更容易实现的选项。客户机向服务器询问给定任务的状态,服务器依次向芹菜任务询问状态。我在我的Flask+Celery blog article中展示了这种方法。
发布于 2021-04-22 22:05:15
我能够通过在Flask服务器上创建和端点来解决这个问题。详情请参阅my answer here
https://stackoverflow.com/questions/33762181
复制相似问题