You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 09:15:03