Python Flask SocketIO无法从redis消息队列接收事件

Python Flask SocketIO无法从redis消息队列接收事件,python,flask,redis,flask-socketio,Python,Flask,Redis,Flask Socketio,我正在尝试使用redis作为消息队列从客户端(在外部进程上运行)向Flask SocketIO服务器发送和接收事件,但服务器未接收客户端发出的任何事件 服务器: 从flask_socketio导入socketio,命名空间 从烧瓶进口烧瓶 类MyNamespace(命名空间): “我的”事件上的def(自身、数据): 打印('收到的数据:',数据) app=烧瓶(名称) app.config['SECRET\u KEY']='SECRET!' socketio=socketio() socket

我正在尝试使用redis作为消息队列从客户端(在外部进程上运行)向Flask SocketIO服务器发送和接收事件,但服务器未接收客户端发出的任何事件

服务器:

从flask_socketio导入socketio,命名空间
从烧瓶进口烧瓶
类MyNamespace(命名空间):
“我的”事件上的def(自身、数据):
打印('收到的数据:',数据)
app=烧瓶(名称)
app.config['SECRET\u KEY']='SECRET!'
socketio=socketio()
socketio.on_名称空间(MyNamespace('/my_名称空间'))
socketio.init_应用程序(应用程序,消息队列)redis://127.0.0.1:6379')
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
app.run()
客户:

从flask_socketio导入socketio
导入时间
socketio=socketio(消息队列=)redis://127.0.0.1:6379')
def test():
计数=0
尽管如此:
打印('数据:',计数)
emit('my_event',{'data':count},
名称空间=“/my_名称空间”,
广播=真)
计数+=1
时间。睡眠(2)
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
测试()
Redis server正在docker容器中运行,docker compose:

version: '3.3'

services:
    redis:
        build: ./redis
        volumes: 
          - ./redis/data:/data
        expose: 
          - 6379
        ports: 
          - 6379:6379
redis cli监视器的输出:

1576594467.587035 [0 172.22.0.1:38534] "PUBLISH" "flask-socketio" "\x80\x03}q\x00(X\x06\x00\x00\x00methodq\x01X\x04\x00\x00\x00emitq\x02X\x04\x00\x00\x00dataq\x03}q\x04h\x03K\x83sX\b\x00\x00\x00callbackq\x05NX\x04\x00\x00\x00roomq\x06NX\b\x00\x00\x00skip_sidq\aNX\x05\x00\x00\x00eventq\bX\b\x00\x00\x00my_eventq\tX\t\x00\x00\x00namespaceq\nX\r\x00\x00\x00/my_namespaceq\x0bX\a\x00\x00\x00host_idq\x0cX \x00\x00\x0053331c21d78649cea28d1ad9e1010179q\ru."
1576594469.590627 [0 172.22.0.1:38534] "PUBLISH" "flask-socketio" "\x80\x03}q\x00(X\x06\x00\x00\x00methodq\x01X\x04\x00\x00\x00emitq\x02X\x04\x00\x00\x00dataq\x03}q\x04h\x03K\x84sX\b\x00\x00\x00callbackq\x05NX\x04\x00\x00\x00roomq\x06NX\b\x00\x00\x00skip_sidq\aNX\x05\x00\x00\x00eventq\bX\b\x00\x00\x00my_eventq\tX\t\x00\x00\x00namespaceq\nX\r\x00\x00\x00/my_namespaceq\x0bX\a\x00\x00\x00host_idq\x0cX \x00\x00\x0053331c21d78649cea28d1ad9e1010179q\ru."
1576594471.593944 [0 172.22.0.1:38534] "PUBLISH" "flask-socketio" "\x80\x03}q\x00(X\x06\x00\x00\x00methodq\x01X\x04\x00\x00\x00emitq\x02X\x04\x00\x00\x00dataq\x03}q\x04h\x03K\x85sX\b\x00\x00\x00callbackq\x05NX\x04\x00\x00\x00roomq\x06NX\b\x00\x00\x00skip_sidq\aNX\x05\x00\x00\x00eventq\bX\b\x00\x00\x00my_eventq\tX\t\x00\x00\x00namespaceq\nX\r\x00\x00\x00/my_namespaceq\x0bX\a\x00\x00\x00host_idq\x0cX \x00\x00\x0053331c21d78649cea28d1ad9e1010179q\ru."

服务器没有打印任何东西,请帮帮我

我认为您对什么是Socket.IO客户端感到困惑。在“客户机”标题下定义的代码不是客户机,而是在服务器上运行的外部进程,可以代表服务器发出

就我所知,一切都很顺利。此外部进程通过服务器发送到客户端。您希望服务器上的
my_事件处理程序将收到此消息,但此事件将以另一种方式进行,客户端将收到它。根据您对问题的描述,您似乎没有连接任何客户端,因此消息不会传到任何地方


如果您想用Python编写一个正确的客户端,那么请删除不需要的消息队列,而是使用Python socketio包中的
client
AsyncClient
类对客户端进行编码。

与redis docker服务相关的客户端和服务器代码在哪里运行?我的怀疑是:如果他们在docker容器中
127.0.0.1
查找本地容器,那么要么使用
redis
(与服务名称相同),如果在同一个容器中,或者
host.docker.internal
,如果超出该组合,您只想访问主机上公开的
6379
。如:
消息redis://redis:6379“
消息队列”redis://host.docker.internal:6379“
服务器和客户端在本地主机中运行,而不是在容器中运行。我认为客户端和服务器都可以通过127.0.0.1:6379访问redis服务器,因为redis cli monitor命令显示redis正在从客户端获取事件。您在服务器中混合了SocketIO扩展的直接和延迟初始化方法。使用
socketio=socketio()
,然后使用
socketio.init_app(app,message_queue='…')
@Miguel:I将我的服务器更改为此,但仍然无法工作:
socketio=socketio()
socketio.init_app(app,message_queue=')redis://127.0.0.1:6379)
socketio.on_名称空间(MyNamespace('/my_名称空间'))
谢谢你的评论,我想我从一开始就误解了这个概念,你完全解释得很好。那么,有没有关于如何使分离的进程(子进程)彼此发送和接收事件的想法呢?正如我在回答中所说的,使用python socketio中的Socket.IO客户机类之一。他们是真正的客户。