【问题标题】:Server Push with SocketIO from Celery Task从 Celery Task 使用 SocketIO 进行服务器推送
【发布时间】:2015-11-17 16:30:46
【问题描述】:

我有一个flask 应用程序,其中有许多长时间运行的异步任务(〜小时)。与客户端沟通这些任务的状态很重要。

我使用celery 管理后台任务队列,我目前正尝试通过socketIO 从每个后台线程向客户端广播更新。这可能吗?有没有更适合的策略来实现我想要的?

【问题讨论】:

    标签: python flask socket.io celery


    【解决方案1】:

    你没有说,但我假设你打算使用 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 中展示了这种方法。

    【讨论】:

      【解决方案2】:

      我能够通过在 Flask 服务器上创建端点来解决这个问题。详情见my answer here

      【讨论】:

        猜你喜欢
        • 2011-12-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-11
        相关资源
        最近更新 更多