Python retrying 重试机制的使用方法

林见深
林见深
发布时间:2026-10-14 | 4人浏览过
原创

本文介绍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重试机制的使用方法介绍完毕,更多相关内容可搜索本站历史文章或继续浏览后续文章,感谢支持!

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表