我正在使用Flask-SocketIO创建一个实时通知系统。有一个外部API服务器,它通过RPC在一个单独的线程中调用socket服务器。RPC调用的方法创建一个Celery任务,该任务在使用时调用调用sockettio .emit()的方法。但是,由于javascript客户端中没有接收到消息,因此该消息似乎并没有实际发送。我的直觉告诉我,由于Celery worker运行在一个单独的进程中,被调用的sockettio .emit()方法没有发送到连接的客户端,尽管对象存在于内存中的同一位置。服务器正在运行gevent,芹菜正在接收并完成日志中显示的任务。进一步验证了socketio.emit()是由Celery worker调用的,并且验证了当任务被直接调用时,绕过Celery, socketio按预期工作。对于如何让套接字正确通信时,它是由芹菜任务在一个单独的进程中引用的任何想法?
您忘记添加message_queue了吗?
socketio.init_app(app, message_queue='redis://localhost:6379/0')
您可以在multiprocessing
或eventlet
模式下运行芹菜
默认情况下,Celery使用multiprocessing
为一个新的worker建立一个新的进程。Eventlet
使用线程,我相信这是您想要在这个场景中使用的,因为您想要共享内存。