python - 从 Celery 任务使用 SocketIO 推送服务器

标签 python flask socket.io celery

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

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

最佳答案

你没有说,但我假设你计划使用 Flask-SocketIO 来处理服务器端 SocketIO 而不是官方的 Node.js 服务器,对吗?

你想做的可以做,但是对于当前版本的 Flask-SocketIO,问题在于托管 Flask 和 Flask-SocketIO 服务器的进程拥有与客户端的套接字连接,因此它是唯一的可以与它们通信的进程。目前,Flask-SocketIO 不提供任何帮助从其他进程(如 Celery worker)向客户端发送数据,这部分你必须自己实现。特别是对于 Celery,您可以让长时间运行的任务公开进度信息,服务器进程可以获取这些信息并将其发送给客户端。

我目前正在对 Flask-SocketIO 进行改进,这将使任何进程都可以使用 Redis 发布/订阅后端向连接的客户端发送消息,以便与 Flask-SocketIO 服务器进行通信。完成这项工作后,您将能够从您的 Celery 进程透明地将数据写入任何客户端。

你还问有没有别的选择。您还应该考虑到客户端可以轮询服务器的状态。如果更新不需要非常频繁,那么这个选项将更容易实现。客户端向服务器询问给定任务的状态,然后服务器依次询问 Celery 任务。我在 Flask+Celery blog article 中展示了这种方法.

关于python - 从 Celery 任务使用 SocketIO 推送服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33762181/

相关文章:

python - 如何在 SQLAlchemy 查询中获取列名?

javascript - 从 javascript 在 Flask 服务器上调用 web 服务方法

javascript - 禁用一个事件并再次在 jQuery 中启用该事件

amazon-web-services - 为什么使用 Socket.io 时 AWS ALB 会断开连接

python - 打印时从字典的值中删除括号

Python写unicode字符错误

python-3.x - python 3.8 flask apache 2.4 wsgi 多处理运行时错误 : fork not supported for subinterpreters

node.js - NodeJS + Cluster + Socket.IO 如何正确创建游戏房间?

python - pip 未指向虚拟环境,在虚拟环境中

python - 将 Python DataFrame 作为 CSV 写入 Azure Blob