Python retrying 重试机制的使用方法
本文介绍Python中实现重试机制的两种方法:基础的循环判断与第三方库retrying。重点解析retrying库的安装、核心参数(如最大重试次数、延迟策略)及自定义异常判断函数的用法,帮助开发者优雅地处理网络请求失败等场景。
在程序开发过程中,经常需要调用外部接口资源。由于网络环境的不确定性,无法保证每次请求都能成功,因此涉及网络请求的代码片段通常需要引入重试机制。接下来将介绍Python中实现重试的几种方式。
循环加判断
最直观的重试方式是在相关代码块外包裹一个循环,并在内部捕获异常。若执行成功则跳出循环,若失败则重复执行。例如:
import requests
def req_with_retry(url):
retry_max = 10 # 最大重试次数为10次
for i in range(1, retry_max+1):
try:
print("第{}次请求".format(i))
# 这里请求不到会抛ConnectTimeout异常
res = requests.get(url, timeout=1)
data = res.json()
print("请求成功:", data)
break
except requests.exceptions.ConnectTimeout as e:
continue
# 请求一个不存在的网址
req_with_retry(https://www.hahaha.cn/haha)
执行结果:

由于访问的网址不存在,程序会持续重试直至达到设定的最大次数10次。这种方式虽然有效,但会在业务逻辑中增加循环判断代码,导致代码侵入性较强,影响可读性。下面介绍更优雅的实现方案。
retrying
retrying是Python的一个第三方库,它提供了一个名为retry的装饰器函数。使用该装饰器包裹的业务函数在运行失败时会自动重新执行,默认行为是只要发生报错就会无限重试,直到执行成功为止。
可以使用pip install retrying进行安装。
以下代码示例通过生成随机数来模拟业务成功与失败的场景:只要生成的随机数大于2,即视为失败并触发重试,直到生成的随机数小于2为止:
import random
from retrying import retry
@retry
def random_with_retry():
if random.randint(0, 10) > 2:
print("大于2,重试...")
raise Exception("大于2")
print("小于2,成功!")
random_with_retry()
运行结果如下:

retry装饰器还支持传入多个参数进行精细控制。以下是Retrying类初始化函数中可选参数的说明:

- stop_max_attempt_number:设置最大重试次数,超过该次数后停止重试。
- stop_max_delay:设置重试过程的总最大延迟时间,超过该时间即停止。
- wait_fixed:设定两次重试之间的固定等待时间。
- wait_random_min和wait_random_max:在指定范围内随机生成两次重试之间的等待时间。
- wait_incrementing_start和wait_incrementing_increment:每次调用后增加固定的时长。
- wait_exponential_multiplier和wait_exponential_max:以指数形式生成两次重试之间的等待时间,计算公式为2^previous_attempt_number * wait_exponential_multiplier(其中previous_attempt_number为已重试次数)。若计算值超过wait_exponential_max,则后续等待时间固定为wait_exponential_max。
特别需要注意的是retry_on_exception参数,它接收一个函数,用法如下:
# 判断异常
def is_MyError(exception):
print("判断异常", exception)
print(isinstance(exception, (ValueError, IOError, ConnectionError)))
return isinstance(exception, (ValueError, IOError, ConnectionError))
@retry(retry_on_exception=is_MyError)
def random_with_retry():
"""
随机一个0-10之前的整数,大于2抛异常,小于2成功
:return:
"""
if random.randint(0, 10) > 2:
print("大于2,重试...")
raise ValueError("大于2")
print("小于2,成功!")
random_with_retry()
该参数的核心思想是:接收一个自定义函数is_MyError,在该函数中判断异常是否属于ValueError、IOError或ConnectionError这三种类型。如果random_with_retry()抛出异常,系统会调用is_MyError()判断返回值:若为True则继续重试,若为False则立即停止并抛出异常。
此外还有retry_on_result参数,同样接收一个函数,用于判断业务函数返回何种结果时需要重试,其逻辑与retry_on_exception类似。开发者可根据实际需求合理搭配这些参数,以达到预期的重试效果。
到此关于Python retrying重试机制的使用方法介绍完毕,更多相关内容可搜索本站历史文章或继续浏览后续文章,感谢支持!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













