socket.io.emit() 未在 redis 函数内运行

问题描述 投票:0回答:1

我正在构建一个 Flask 应用程序,其中使用 Redis 从服务器接收数据,然后使用 Socket.IO 将该数据发送到前端。但是,emit() 函数没有按预期将数据发送到前端。

这是我的 Redis 订阅者功能:

def redis_subscriber():
    pubsub = r.pubsub()
    pubsub.subscribe('feed_channel')
    print("Subscribed to feed_channel")
    for message in pubsub.listen():
        if message['type'] == 'message':
            try:
                data = message['data'].decode('utf-8')
                # print(f"Emitting Redis data: {data}")
                socketio.emit('new_data', json.dumps({"message": "Connected to Flask server"}))

            except Exception as e:
                print(f"Error processing message: {e}")

Redis 订阅工作正常,我可以确认正在接收消息。但是,socketio.emit() 调用似乎没有将数据发送到前端。

Redis 已正确设置并将消息发布到 feed_channel。 Socket.IO 服务器正在运行并连接到前端。

什么可能导致emit()函数无法通过WebSocket发送数据?

flask websocket redis socket.io flask-socketio
1个回答
0
投票

pubsub.listen()
阻塞,您的 redis_subscriber 函数卡在
for message in pubsub.listen():
循环内。 它无限期地等待来自
Redis
/
Valkey
的新消息。

您将整个主线程用于订阅者,并且

socketio
引擎没有机会实际对数据执行某些操作,因为循环仍在继续。

如果您想要异步 API,请移至 valkey-glide,这也将为您提供更好的 pub sub 容错能力。

如果您想继续使用同步 API,请使用

socketio.start_background_task()
(在大多数情况下更推荐)或
threading.Thread

© www.soinside.com 2019 - 2024. All rights reserved.