来自异步芹菜工作者的 SocketIO 发出不工作

Posted

技术标签:

【中文标题】来自异步芹菜工作者的 SocketIO 发出不工作【英文标题】:SocketIO emit from Asynchronous Celery worker is not working 【发布时间】:2014-10-10 02:48:47 【问题描述】:

我正在使用 Flask-SocketIO 创建一个实时通知系统。有一个外部 API 服务器通过 RPC 在单独的线程中调用 socketio 服务器。 RPC 调用的方法会创建一个 Celery 任务,当使用该任务时,会调用一个调用 socketio.emit() 的方法。但是,该消息似乎并未实际发送,因为在 javascript 客户端中未收到任何消息。我的直觉告诉我,当 Celery 工作进程在单独的进程中运行时,被调用的 socketio.emit() 方法不会发送到连接的客户端,尽管对象存在于内存中的同一位置。服务器正在运行 gevent,Celery 正在接收并完成日志中看到的任务。此外,我已验证 socketio.emit() 正在由 Celery 工作人员调用,并且我已验证当直接调用任务时,绕过 Celery,socketio 按预期工作。当 celery 任务在一个单独的进程中引用它时,如何让 socketio 正确通信有什么想法吗?

【问题讨论】:

你可能没有将应用内容推送给 celery worker 【参考方案1】:

你忘了添加 message_queue 吗?

socketio.init_app(app, message_queue='redis://localhost:6379/0')

【讨论】:

对于任何寻找的人,这解决了尝试从 celery 任务发射时的runtime error: working outside of request context【参考方案2】:

您可以在 multiprocessingeventlet 模式下运行 Celery。

默认情况下,Celery 使用multiprocessing 为新工作人员设置新进程。 Eventlet 使用线程,我相信这是您想要在这种情况下使用的线程,因为您需要共享内存。

您可能会发现这个documentation 很有用。

【讨论】:

以上是关于来自异步芹菜工作者的 SocketIO 发出不工作的主要内容,如果未能解决你的问题,请参考以下文章

SocketIO 发出函数记录但无法正常工作

芹菜不处理来自 RabbitMQ 的任务

向所有客户端发出的 SocketIO 不起作用

芹菜是如何工作的?

如何优雅地重启芹菜工人?

使用 ack SocketIO 与 iOS 发出