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

时间:2014-08-16 17:27:19

标签: python flask socket.io celery gevent

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

2 个答案:

答案 0 :(得分:0)

您可以multiprocessingeventlet模式运行Celery。

默认情况下,Celery使用multiprocessing为新工作人员设置新流程。 Eventlet使用线程,我认为这是您希望在此场景中使用的线程,因为您需要共享内存。

您可能会发现此documentation有用。

答案 1 :(得分:0)

您是否忘记添加message_queue?

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