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

远程断开后复用requests.Session:自动重连及处理方式咨询

关于requests.Session复用失效连接的问题

问题场景

当创建requests.Session()并用于多请求时,某请求抛出如下异常:

requests.exceptions.ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response',))

捕获异常后继续复用该Session发起请求,会发生什么?已知Session会缓存TCP连接供多请求复用,该连接在异常时已失效。需明确:

  • Session是否会自动重建连接?
  • 是否需要在异常处理器中手动处理?
  • 若需手动处理,有没有方法让Session在连接失败时自动尝试重建?

触发异常的代码片段:

sess = requests.Session()
try:
    response = sess.get('http://someapi.com')
    response = sess.get('http://someapi.com') # 抛出requests.exceptions.ConnectionError
except requests.exceptions.ConnectionError:
    response = sess.get('http://someapi.com') # 这里会发生什么?

解答

  • Session不会自动清理失效连接
    远端主动关闭TCP连接后,Session的连接池里仍会保留这个失效连接的引用。直接复用Session发起下一次请求时,Requests会尝试用这个失效连接发送数据,大概率会再次抛出相同的ConnectionError。

  • 需要手动处理失效连接
    你得在异常捕获块里手动清理连接池中的失效连接,有两种常用方式:

    1. 关闭当前Session并重建:
      except requests.exceptions.ConnectionError:
          sess.close()
          sess = requests.Session()
          response = sess.get('http://someapi.com')
      
    2. 精准移除对应主机的失效连接(更高效,无需重建整个Session):
      except requests.exceptions.ConnectionError:
          adapter = sess.get_adapter('http://someapi.com')
          adapter.close()
          response = sess.get('http://someapi.com')
      
  • 让Session自动重试重建连接的方法
    可以结合requests.adapters.HTTPAdapter和urllib3.util.retry.Retry配置自动重试策略,遇到连接错误时自动重试并重建新连接:

    from requests.adapters import HTTPAdapter
    from urllib3.util.retry import Retry
    
    sess = requests.Session()
    # 配置重试策略:连接错误重试3次,支持指定状态码和请求方法的重试
    retry_strategy = Retry(
        total=3,
        backoff_factor=1,
        status_forcelist=[429, 500, 502, 503, 504],
        allowed_methods=["GET", "POST"]
    )
    adapter = HTTPAdapter(max_retries=retry_strategy)
    sess.mount("http://", adapter)
    sess.mount("https://", adapter)
    
    # 后续请求遇到连接错误会自动重试,重试时会重建连接
    try:
        response = sess.get('http://someapi.com')
        response = sess.get('http://someapi.com')
    except requests.exceptions.ConnectionError:
        # 仅当重试3次全部失败时进入,可在此做兜底处理
        pass
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 10:20:43