SocketIO 从异步 Celery 工作进程发射无效

7 投票
2 回答
1302 浏览
提问于 2025-04-18 17:30

我正在使用Flask-SocketIO来创建一个实时通知系统。有一个外部的API服务器,它通过RPC在一个单独的线程中调用socketio服务器。这个RPC调用的方法会创建一个Celery任务,当这个任务被处理时,会调用一个方法,然后执行socketio.emit()。不过,似乎消息并没有真正发送,因为在JavaScript客户端没有收到任何消息。我感觉可能是因为Celery工作者是在一个单独的进程中运行的,所以调用的socketio.emit()方法没有发送到连接的客户端,尽管这些对象在内存中是存在的。服务器正在运行gevent,而Celery也在接收和完成任务,这在日志中可以看到。此外,我已经确认Celery工作者确实调用了socketio.emit(),而且我也验证了当直接调用这个任务,绕过Celery时,socketio是正常工作的。有没有什么想法可以让socketio在被Celery任务引用时正确通信?

2 个回答

0

你可以在 multiprocessing 模式或 eventlet 模式下运行 Celery。

默认情况下,Celery 会使用 multiprocessing 来为每个新的工作者设置一个新的进程。而 eventlet 则是使用线程,我认为在这种情况下你可能更想用它,因为你需要共享内存。

你可以查看这个 文档,它可能会对你有帮助。

2

你是不是忘了加上消息队列?

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

撰写回答