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

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=-1 或 None 代表无限制,与预期“立即失败”相反。另外,把整个 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
- 调试阶段可临时设高一点,上线前务必压测验证










