tenacity
是一个用于 Python 的重试库,它可以帮助你在遇到临时性错误(如网络波动、API 限流等)时自动重试代码块或函数调用,提高程序的健壮性和稳定性。该库提供了灵活的重试策略配置,包括设置最大重试次数、重试间隔、特定异常类型触发重试等功能。
核心功能与特点
- 灵活的重试条件:可以基于返回值、异常类型或自定义条件触发重试。
- 多种等待策略:支持固定间隔、指数退避、随机延迟等多种重试间隔策略。
- 回调与上下文管理:支持在重试前后执行回调函数,以及使用上下文管理器管理重试逻辑。
- 错误处理:可以设置最大重试次数、总超时时间,以及在所有重试失败后抛出特定异常。
简单示例
以下是一个使用 tenacity
的简单示例,展示如何对可能失败的函数进行重试:
from tenacity import retry, stop_after_attempt, wait_fixed
@retry(stop=stop_after_attempt(3), wait=wait_fixed(2))
def fetch_data():
# 模拟一个可能失败的操作
import random
if random.random() < 0.7: # 70% 的概率失败
raise ConnectionError("连接失败,请重试")
return "成功获取数据"
try:
result = fetch_data()
print(result)
except Exception as e:
print(f"所有重试均失败: {e}")
在这个示例中:
- @retry
装饰器使 fetch_data
函数在失败时自动重试。
- stop_after_attempt(3)
表示最多重试 3 次。
- wait_fixed(2)
表示每次重试间隔 2 秒。
常用配置参数
- 停止策略:
stop_after_attempt(n)
:最多重试 n 次。stop_after_delay(seconds)
:总重试时间不超过指定秒数。-
组合策略:如
stop_after_attempt(3) | stop_after_delay(10)
。 -
等待策略:
wait_fixed(seconds)
:固定间隔等待。wait_exponential(multiplier=1, min=4, max=10)
:指数退避,间隔时间逐渐增加。-
wait_random(min=1, max=3)
:随机间隔等待。 -
异常过滤:
retry_if_exception_type(ExceptionType)
:仅当抛出特定异常时重试。retry_if_result(predicate)
:基于返回值判断是否重试(如lambda x: x is None
)。
进阶用法
from tenacity import retry, wait_exponential, stop_after_attempt, retry_if_exception_type
@retry(
wait=wait_exponential(multiplier=1, min=2, max=10), # 指数退避,初始2秒,最大10秒
stop=stop_after_attempt(5), # 最多重试5次
retry=retry_if_exception_type((ConnectionError, TimeoutError)), # 仅对特定异常重试
reraise=True # 重试失败后重新抛出最后一个异常
)
def call_flaky_api():
# 调用可能不稳定的API
pass
应用场景
- 网络请求:处理临时性网络故障或服务端限流。
- 分布式系统:处理节点间的临时通信问题。
- API 调用:应对第三方 API 的偶尔不可用。
- 定时任务:确保关键任务在短暂故障时仍能执行成功。
tenacity
通过简洁的 API 提供了强大的重试功能,减少了手动编写复杂重试逻辑的工作量,让代码更加健壮和可靠。