Python 如何正确设置请求超时?

11次阅读

python中正确设置请求超时需区分connect与read超时:connect控制建连(dns、握手),read控制响应接收;推荐显式使用元组如timeout=(2,8),避免timeout=0或None,并结合Retry实现指数退避重试。

Python 如何正确设置请求超时?

Python 中正确设置请求超时,关键在于区分连接超时(connect timeout)和读取超时(read timeout),并根据实际场景合理组合使用。requests 库默认不设超时,若服务响应慢或网络异常,程序可能无限等待,导致阻塞或资源耗尽。

明确 connect 和 read 超时的区别

connect 超时控制的是建立 TCP 连接所需时间,比如 DNS 解析、三次握手;read 超时则控制连接建立后,等待服务器返回响应数据的时间(含首字节和后续传输)。两者独立生效,不能互相替代。

  • 只设 timeout=5:等价于 timeout=(5, 5),即 connect 和 read 都为 5 秒
  • 分别设置:timeout=(3, 10) 表示最多 3 秒建连,建连成功后最多等 10 秒收完整响应
  • 仅限制建连:timeout=(3, None) 允许无限读取(不推荐)

避免常见错误写法

直接写 timeout=0 会触发 socket 错误;用 timeout=-1None 代表无限制,与预期“立即失败”相反。另外,把整个 timeout 设得过大(如 60 秒)而没拆分,容易掩盖建连慢的真实问题。

  • requests.get(url, timeout=0) —— 报错 OSError
  • requests.get(url, timeout=None) —— 等同于永不超时
  • ✅ 推荐显式写成元组:requests.get(url, timeout=(2, 8))

结合重试机制更可靠

单次超时只能防止卡死,但网络抖动或临时性故障需要自动重试。建议用 urllib3.util.Retry 配合 requests.session,避免手动轮询。

立即学习Python免费学习笔记(深入)”;

  • 对连接失败、超时、5xx 响应可自动重试
  • 设置 backoff_factor 实现指数退避,减轻服务压力
  • 示例:重试 3 次,间隔从 1s → 2s → 4s

超时值设定要贴合业务场景

内部 API 调用可设短些(如 (1, 3)),公网第三方接口建议放宽(如 (3, 15)),文件下载类操作需延长 read 超时,并考虑流式处理 + 分块读取。

  • 普通 jsON 接口:(2, 5)
  • 上传/下载大文件:(5, 30) 起步,配合 stream=True 和 iter_content
  • 调试阶段可临时设高一点,上线前务必压测验证
text=ZqhQzanResources