s = requests.Session()
r = s.get(url, timeout=(3.05, 10))
# 连接 3 秒读取 10 秒

脚本调第三方接口偶尔卡十几分钟不返回,进程堆在那里只能手动杀掉,日志里没有超时记录。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。

原因不复杂,requests 默认没有超时,连接或读取任一端不响应就一直等,timeout 只给一个数字时仅作用于读取阶段,排查很容易走偏。

「requests 超时设置」排查到最后往往是很小的一处差异,前面那些复杂猜测可以先放一放。备份不是备了就行,恢复一次才算数,很多备份文件打开才发现是空的。

接口问题先分清是没发出去、发出去了没收到,还是收到了处理失败。偶发问题先统计频率,一小时几次和一天一次,查法完全不同。

处理上按这个顺序:timeout 传元组,分别控制连接和读取;捕获到超时异常之后,按限定次数再重试一次;批量调用时在循环的外层再套一层总时长上限。

改完只确认一件事:断网时几秒内抛 ReadTimeout,脚本按预期进入重试分支。

作者 9823189