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

Python SocketIO报KeyError: 'Session is disconnected'的原因与解决方法

错误含义

KeyError: 'Session is disconnected' 是SocketIO依赖的底层传输组件EngineIO抛出的异常,实际触发逻辑如下:
每个SocketIO客户端连接后会被分配唯一的会话ID(sid),服务端会保留对应会话的上下文信息。当客户端异常断连(比如直接关闭页面、网络中断、超过心跳超时时间未上报存活状态),服务端会主动清理掉对应sid的会话记录。后续如果服务端收到了携带这个已失效sid的请求,查找会话记录失败就会抛出该错误。
对于运行在树莓派这类资源有限的嵌入式设备上的服务,并发处理能力有限,会话清理和请求处理的时序更容易出现冲突,10-20个客户端的并发场景下该报错属于常见的非致命异常。

修复方案

预防措施(从根源减少报错触发)

  • 调整SocketIO心跳配置,适配弱网/低性能设备场景,初始化SocketIO实例时增加心跳超时和间隔时间,避免误判客户端断连:
# 示例:心跳间隔调整为30秒,超时时间调整为120秒
socketio = SocketIO(app, ping_interval=30, ping_timeout=120)
  • 客户端侧实现规范的断连重连逻辑,重连后使用新分配的sid发起请求,不要复用历史失效sid
  • 替换Flask自带的开发服务器,使用gunicorn + eventlet的生产级服务器组合运行服务,开发服务器本身对长连接的会话管理支持不完善,是这类报错的高发诱因

屏蔽措施(不影响业务时忽略报错)

如果该报错不影响正常业务逻辑,可以通过以下方式屏蔽错误栈输出,避免占用日志存储空间:

  • 新增全局异常捕获,针对该特定异常做特殊处理,不抛出完整错误栈:
@app.errorhandler(KeyError)
def handle_disconnected_session(error):
    if str(error) == 'Session is disconnected':
        return {"code": 410, "msg": "会话已失效"}, 410
    # 其他类型的KeyError正常抛出
    raise error
  • 调整相关组件的日志级别,仅输出警告及以上级别的日志:
import logging
# 屏蔽engineio、socketio组件的INFO及以下级别日志
logging.getLogger("engineio").setLevel(logging.WARNING)
logging.getLogger("socketio").setLevel(logging.WARNING)

内容的提问来源于stack exchange,提问作者Salvatore

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 00:06:07