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

为何requests会立即抛出ReadTimeout异常?

关于requests提前触发ReadTimeout异常的原因解析

先贴出你提到的代码片段:

data = "xml document"
auth = username, password
response = requests.patch(url, data=data, auth=auth,
    headers={'Content-type': 'application/xml'}, timeout=10)

针对部分场景下远早于设定的10秒就抛出requests.exceptions.ReadTimeout的情况,下面是具体的原因分析,以及对服务端响应相关问题的解答:

可能的触发原因

  • TCP连接被主动中断:这是最常见的情况。当请求发送后,如果服务端因过载、资源耗尽或内部错误主动关闭连接(发送RST/FIN包),或者中间网络设备(防火墙、负载均衡器)因规则触发(比如请求内容触发WAF拦截、流量限制)切断连接,requests会立即感知到连接中断,直接抛出ReadTimeout异常,不会等待到你设定的10秒超时时间。
  • 超时参数的实际逻辑误解:你设置的timeout=10是同时限制连接超时和读取超时的最大值,但读取超时的计时并非无限制等待——如果服务端在发送部分响应数据后突然停止传输,且没有关闭连接,客户端会等待到超时;但如果服务端直接断开连接,客户端会立即触发异常,不会等待剩余时长。
  • 系统层面的网络限制:某些操作系统或网络环境下存在默认的TCP超时设置(比如Linux的tcp_keepalive参数),如果这些系统级超时比你设置的10秒更短,会优先触发连接中断,进而被requests捕获为ReadTimeout。

服务端特定响应是否会导致立即超时?

严格来说,服务端返回的合法响应内容不会直接触发ReadTimeout,但服务端在响应过程中的异常行为会:

  • 服务端返回响应头后,既不继续发送响应体,也不关闭连接,这种情况下requests会等待到你设置的读取超时才抛出异常;但如果服务端在返回部分数据后主动断开连接,requests会立即感知并抛出ReadTimeout。
  • 服务端返回不符合HTTP规范的响应(比如非法的分块编码格式、缺失必要的响应头),requests在解析响应时可能出现异常,部分边界场景下这类异常会被包装为ReadTimeout抛出(更常见的是ConnectionError,但取决于具体的解析失败原因)。

排查建议

你可以将timeout参数拆分为元组,分别设置连接超时和读取超时,比如:

response = requests.patch(url, data=data, auth=auth,
    headers={'Content-type': 'application/xml'}, timeout=(3, 10))

这样可以区分是连接阶段的问题(如果触发超时时间接近3秒)还是读取阶段的问题(接近10秒),帮助进一步定位原因。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 14:35:12