Python socketio的emit()执行结束才发数据 如何实现实时计时器
问题解决:Python SocketIO 服务端消息批量发送无法实时下发
根因说明
你遇到的问题是Python SocketIO的事件回调机制导致的:默认所有事件回调函数在执行完毕前,回调内部调用emit发送的消息都会被暂存在缓冲区,直到回调函数返回后才会批量下发给客户端,所以你写在connect回调里的循环结束前所有计数消息都不会真正发出。
修复方案
将倒计时逻辑从connect回调中拆分,通过SocketIO提供的后台任务接口启动独立协程运行,connect回调启动任务后立刻返回,即可实现消息实时发送。
修复后完整服务端代码
import socketio sio = socketio.Server() app = socketio.WSGIApp(sio, static_files={ '/': './public/' }) # 独立的倒计时任务函数 def countdown(sid): count = 10 while count > 0: # 指定发给当前连接的客户端,避免广播 sio.emit('timer_count', count, to=sid) sio.sleep(1) count -= 1 @sio.event def connect(sid, environ): # 启动后台倒计时任务,不会阻塞connect回调返回 sio.start_background_task(countdown, sid) # 异步服务启动入口(需提前安装eventlet依赖:pip install eventlet) if __name__ == '__main__': import eventlet eventlet.wsgi.server(eventlet.listen(('127.0.0.1', 5000)), app)
运行注意事项
- 必须使用异步运行环境,推荐搭配eventlet,不要使用Python自带的同步WSGI测试服务器,否则依然会出现消息阻塞的情况
- emit时添加
to=sid参数可确保计数消息只发给对应连接的客户端,避免误广播给所有在线用户
内容的提问来源于stack exchange,提问作者Harry
相关产品推荐
相关产品推荐

