_retry是一种容错重试编程实践,用于网络请求等易失败操作;可手动用装饰器实现基础重试逻辑,或使用tenacity库支持指数退避、条件重试等高级特性。

什么是_retry设计模式
_retry不是Python内置的语法或标准库模块,而是一种常见的编程实践:当某段代码执行失败(抛出异常)时,自动重试若干次,而非立即中断。它本质是“容错+重试”的组合逻辑,常用于网络请求、数据库连接、文件读写等易受外部因素干扰的操作。
手动实现简易_retry装饰器
不依赖第三方库,用函数装饰器即可快速封装重试逻辑:
- 捕获指定异常类型(如
ConnectionError、TimeoutError),其他异常不重试 - 设置最大重试次数(如3次),首次执行算第0次,失败后重试最多n次
- 可加入简单退避(如每次重试前
time.sleep(1)),避免高频冲击
示例代码:
import time
import functools
<p>def _retry(max_attempts=3, delay=1, exceptions=(Exception,)):
def decorator(func):
@functools.wraps(func)
def wrapper(*args, *<em>kwargs):
for attempt in range(max_attempts + 1):
try:
return func(</em>args, **kwargs)
except exceptions as e:
if attempt == max_attempts:
raise e
time.sleep(delay)
return None
return wrapper
return decorator</p><h1>使用示例</h1><p>@_retry(max_attempts=2, delay=0.5, exceptions=(ConnectionError,))
def fetch_data():</p><h1>模拟可能失败的网络请求</h1><pre class="brush:php;toolbar:false;">import random
if random.random() < 0.7:
raise ConnectionError("Network unstable")
return "data received"
立即学习“Python免费学习笔记(深入)”;
系统简介:冰兔BToo网店系统采用高端技术架构,具备超强负载能力,极速数据处理能力、高效灵活、安全稳定;模板设计制作简单、灵活、多元;系统功能十分全面,商品、会员、订单管理功能异常丰富。秒杀、团购、优惠、现金、卡券、打折等促销模式十分全面;更为人性化的商品订单管理,融合了多种控制和独特地管理机制;两大模块无限级别的会员管理系统结合积分机制、实现有效的推广获得更多的盈利!本次更新说明:1. 增加了新
用tenacity库实现更健壮的_retry
生产环境推荐使用tenacity——专为重试设计的成熟库,支持指数退避、停止条件、重试条件、回调钩子等高级特性:
-
stop_after_attempt(3):最多尝试3次(含首次) -
wait_exponential(multiplier=1, min=1, max=10):指数退避,间隔从1s→2s→4s…,上限10s -
retry_if_exception_type(ConnectionError):只对特定异常重试 - 支持异步函数(
@retry_async)、结果校验(retry_if_result)等
安装与基本用法:
...
关键注意事项
重试不是万能解药,滥用反而加重问题:
- 避免对非幂等操作重试:比如重复提交订单、扣款,可能造成业务重复
- 明确重试边界:区分临时性错误(网络超时)和永久性错误(404、401、参数错误),后者不应重试
- 记录重试日志:每次重试应打日志(含attempt编号、异常类型、耗时),便于排查和监控
- 注意上下文状态:若函数内部有状态变更(如修改了全局变量、缓存),重试可能导致状态不一致









