从异步Celery工作器发出的SocketIO不起作用

Mit*_*les 7 python celery gevent flask socket.io

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

Mun*_*med 0

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

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

您可能会发现此文档很有用。