Python网络请求需分设连接超时(2–5秒)和读取超时(5–15秒),用requests.timeout=(connect,read)精确控制;捕获Timeout异常并重试,结合指数退避与监控提升健壮性。
Python网络请求容易因网络波动、服务不可用或响应缓慢而卡住,设置合理的超时机制是提升程序健壮性的关键一步。不设超时,程序可能无限等待;超时设得太短,又容易误判正常延迟为失败。核心在于分层控制:连接超时(connect timeout)和读取超时(read timeout)需分别设置,且应结合重试与异常分类处理。
使用 requests 库时,timeout 参数接受元组 (connect_timeout, read_timeout)。前者控制建立 TCP 连接的最大等待时间(如 DNS 查询、三次握手),后者控制连接建立后等待服务器返回数据的时间(含响应头和响应体)。例如 requests.get(url, timeout=(3, 10)) 表示 3 秒内必须连上,连上后最多等 10 秒收完响应。
requests 的超时抛出的是 requests.exceptions.Timeout,它继承自 requests.exceptions.RequestException,但不同于 ConnectionError 或 HTTPError。应单独捕获 Timeout 并做针对性处理(如降级、告警、重试),而不是用 except Exception: 一并兜底。
或目标拒绝连接引发,与超时逻辑不同,建议分开日志记录和应对策略单次超时不代表永久失败。配合 retry 策略可显著提升成功率。推荐使用 urllib3 的 Retry 类或 requests.adapters.HTTPAdapter 配置重试逻辑,而非手写 while 循环。
超时不是静默失败的终点,而是可观测性的起点。记录每次请求的耗时、是否超时、重试次数、最终状态,有助于定位网络瓶颈或服务异常。