
Python调用外部接口时,网络抖动、服务端临时不可用或响应缓慢都可能导致请求失败。单纯设置超时参数不够,必须配合重试机制才能提升接口调用的健壮性。
合理设置请求超时时间
超时应拆分为连接超时(connect timeout)和读取超时(read timeout),避免因某一项卡死导致整体阻塞。
- 连接超时:一般设为1~3秒,用于建立TCP连接;
- 读取超时:根据业务预期响应时间设定,如API平均耗时800ms,可设为2~5秒;
- 使用requests时推荐显式传入timeout=(3, 5),元组第一个值是connect,第二个是read。
设计可控的重试策略
不是所有错误都适合重试,也不是重试次数越多越好。需区分错误类型并设定退出条件。
- 只对网络类异常(requests.exceptions.ConnectionError、Timeout)和部分HTTP状态码(如502/503/504)重试;
- 避免对400/401/404等客户端错误重试;
- 建议最多重试2~3次,配合指数退避(如第一次等1s、第二次等2s、第三次等4s),防止雪崩效应。
用tenacity实现简洁可靠的重试逻辑
相比手写while循环,tenacity库更专业、可配置性强,且天然支持异步、回调和统计。
立即学习“Python免费学习笔记(深入)”;
- 安装:pip install tenacity;
- 基础用法示例:
from tenacity import retry, stop_after_attempt, wait_exponential, retry_if_exception_type
import requests
@retry(
stop=stop_after_attempt(3),
wait=wait_exponential(multiplier=1, min=1, max=10),
retry=retry_if_exception_type((
requests.exceptions.ConnectionError,
requests.exceptions.Timeout
))
)
def call_api(url):
return requests.get(url, timeout=(3, 5))
记录与监控不可忽视
重试成功不等于无问题,频繁重试是系统隐患的信号。
- 每次重试前记录日志,包含URL、尝试次数、异常类型、等待时长;
- 对单个请求累计重试超过阈值(如3次)触发告警;
- 将重试次数、最终耗时、成功率等指标上报至监控系统,辅助容量评估。










