tenacity-Python 的重试库


tenacity 是一个用于 Python 的重试库,它可以帮助你在遇到临时性错误(如网络波动、API 限流等)时自动重试代码块或函数调用,提高程序的健壮性和稳定性。该库提供了灵活的重试策略配置,包括设置最大重试次数、重试间隔、特定异常类型触发重试等功能。

核心功能与特点

  1. 灵活的重试条件:可以基于返回值、异常类型或自定义条件触发重试。
  2. 多种等待策略:支持固定间隔、指数退避、随机延迟等多种重试间隔策略。
  3. 回调与上下文管理:支持在重试前后执行回调函数,以及使用上下文管理器管理重试逻辑。
  4. 错误处理:可以设置最大重试次数、总超时时间,以及在所有重试失败后抛出特定异常。

简单示例

以下是一个使用 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 提供了强大的重试功能,减少了手动编写复杂重试逻辑的工作量,让代码更加健壮和可靠。