Python
- 基础
-
库
- 其他
- argparse命令行参数解析
- asyncio自带异步编程库
- aiofiles异步文件读写库
- beautifulsoup4_HTML_XML解析库
- colorama_在终端输出漂亮的字
- datasets数据集处理
- html2text
- httpx_HTTP请求库
- litellm
- loguru日志库
- numpy科学计算基础库
- pillow图像处理
- pydantic数据验证
- pyyaml
- requests_HTTP请求库
- tenacity重试
- tiktoken计算Token量
- torch机器学习_深度学习框架
- tomli TOML文件解析库
- tomllib 自带TOML文件解析库
- unidiff_文本_文件差异对比
- uvicorn_Web服务器
- langchain
**Tenacity** 是 Python 的一个第三方库,用于实现 **重试机制(retry)**,即当某段代码执行失败时,自动进行**重复尝试(重试)**,直到成功或达到最大重试次数。
---
## 一、Tenacity 是什么?(通俗理解)
- 想象你在调用一个可能失败的函数,比如:
- 请求一个不稳定的 API
- 连接一个可能暂时不可用的数据库
- 读写一个可能被占用的文件
- 如果第一次失败了,你可能想 **自动重试几次**,而不是立刻报错退出。
- **Tenacity 就是帮你自动实现这种“失败后重试”逻辑的 Python 工具库。**
---
## 二、为什么需要 Tenacity?
在真实开发中,很多操作可能会因为网络抖动、资源忙、服务暂时不可用等原因**失败一次或几次,但稍后重试可能就成功了**。
手动写重试逻辑(比如 try-except + 循环)会很繁琐,而且难以控制:
- 重试多少次?
- 每次间隔多久?
- 什么异常才重试?
- 达到最大次数后怎么办?
**Tenacity 就是为了解决这些问题,提供了一种优雅、灵活、强大的方式来实现重试机制。**
---
## 三、Tenacity 的核心功能
使用 Tenacity,你可以轻松为任何函数添加重试行为,并且可以自定义:
| 功能 | 说明 |
|------|------|
| **自动重试** | 当函数抛出异常时,自动重新调用该函数 |
| **设置重试次数** | 最多重试几次,比如最多重试 5 次 |
| **设置重试间隔** | 每次重试之间等待多久,比如等 2 秒再试 |
| **指数退避(Exponential Backoff)** | 每次重试的间隔时间逐渐增加,减轻服务器压力 |
| **根据异常类型重试** | 只对某些特定的异常(如网络错误)进行重试 |
| **重试条件控制** | 可以自定义什么时候才触发重试 |
| **重试停止条件** | 达到某种条件后停止重试,比如成功了、超过最大次数等 |
| **重试日志与回调** | 可以记录重试过程,或在重试前后执行额外逻辑 |
---
## 四、安装 Tenacity
使用 pip 安装:
```bash
pip install tenacity
```
---
## 五、简单使用示例
### 示例 1:基本重试(失败后自动重试 3 次)
```python
from tenacity import retry, stop_after_attempt
import time
@retry(stop=stop_after_attempt(3)) # 最多重试 3 次
def 可能失败的操作():
print("尝试执行...")
raise Exception("模拟失败!") # 模拟一个异常
可能失败的操作()
```
**运行结果:** 函数会尝试执行 3 次,每次都失败,最后抛出异常。
---
### 示例 2:带等待的重试(每次失败后等 2 秒)
```python
from tenacity import retry, stop_after_attempt, wait_fixed
import time
@retry(stop=stop_after_attempt(3), wait=wait_fixed(2)) # 每次等 2 秒
def 可能失败的操作():
print("尝试执行...")
raise Exception("模拟失败!")
可能失败的操作()
```
**效果:** 每次失败后,等待 2 秒再重试,总共最多重试 3 次。
---
### 示例 3:只对特定异常重试
```python
from tenacity import retry, stop_after_attempt, wait_fixed
import requests
@retry(stop=stop_after_attempt(3), wait=wait_fixed(1))
def 请求接口():
response = requests.get("https://不存在的网址.com")
response.raise_for_status() # 如果 HTTP 请求失败,抛出异常
请求接口() # 只有 requests 相关的异常会触发重试
```
---
## 六、总结(中文)
> **Tenacity 是 Python 中专门用来实现函数重试机制的库,它让“失败后自动重试”变得非常简单、灵活和强大。**
>
> 适用于网络请求、数据库连接、文件操作等可能临时失败但可恢复的场景。
>
> 主要优点:
> - 简单易用(通过装饰器即可实现)
> - 功能强大(支持自定义重试次数、间隔、异常类型等)
> - 可靠稳定(适合生产环境使用)
如果你想在 Python 中为某个可能失败的操作添加“失败后自动重试”的功能,**Tenacity 是首选工具**。