我正在构建一个 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发送数据?
pubsub.listen()
阻塞,您的 redis_subscriber 函数卡在 for message in pubsub.listen():
循环内。
它无限期地等待来自 Redis
/Valkey
的新消息。
您将整个主线程用于订阅者,并且
socketio
引擎没有机会实际对数据执行某些操作,因为循环仍在继续。
如果您想要异步 API,请移至 valkey-glide,这也将为您提供更好的 pub sub 容错能力。
如果您想继续使用同步 API,请使用
socketio.start_background_task()
(在大多数情况下更推荐)或 threading.Thread
。