Python retrying模块重试机制详解与参数配置

南乔
南乔
发布时间:2026-10-13 | 5人浏览过
原创

本文详细介绍Python中retrying模块的安装方法及通过装饰器实现自动重试的核心用法。深入解析stop_max_attempt_number、wait_fixed、wait_exponential等关键参数的配置逻辑,结合代码示例说明如何控制重试次数、等待时间及异常过滤条件,帮助开发者高效处理爬虫或网络请求中的不稳定情况。

前言与模块介绍

前言

在进行爬虫开发或网络请求时,偶尔出现抓取失败是常见现象。面对此类情况,通常的做法是使用try...except语句块手动编写重试逻辑,但这会导致代码冗余且维护困难。为此,本文推荐一个更具Python风格的解决方案:retrying模块,它能显著简化重试操作的实现过程。

模块安装

安装

retrying模块的安装过程十分便捷,只需通过pip工具执行标准安装命令即可获取该库。


pip install retrying

基础重试示例

retrying模块的核心机制是基于Python装饰器来实现重试逻辑。为了直观展示其工作原理,我们先观察一个基础示例。


from retrying import retry
@retry(stop_max_attempt_number=5,wait_random_min=1000,wait_random_max=5000)
def run():
  print("开始重试")
  raise NameError

if __name__ == '__main__':
  run()

上述示例代码主要执行了以下操作:首先导入retrying库中的retry模块,随后使用@retry装饰器包裹一个名为run的函数。该函数的逻辑非常简单,即打印提示信息后主动抛出一个NameError异常。

运行这段代码后,控制台会依次打印五次“开始重试”的提示。当达到预设的重试上限后,程序最终抛出NameError异常并终止执行。

通过这一简短示例,我们可以清晰地看到重试机制的实际效果:代码仅用几行便实现了五次自动重试,且每次重试之间的间隔时间并非固定,而是呈现出不同的等待策略。

若希望将重试次数调整为10次,只需将示例中的stop_max_attempt_number参数值从5修改为10即可。基于此,我们可以进一步解析retry装饰器中各个参数的具体含义。

stop_max_attempt_number:定义最大重试次数。当重试次数达到该设定值时,系统将停止重试并抛出最后一次捕获到的异常。

wait_random_min:设定随机等待的最小时间(毫秒)。

wait_random_max:设定随机等待的最大时间(毫秒)。

综上所述,retrying模块的使用非常直观:只需在需要重试的函数定义前添加相应的装饰器,并配置好相关参数即可实现自动重试功能。

核心参数详解

装饰器内部参数的配置是控制重试行为的关键,以下列举了retrying模块支持的主要参数及其作用。

若在使用装饰器时不传入任何参数,系统将默认执行无限次重试,直到函数成功返回或遇到不可恢复的错误。

stop_max_attempt_number:指定在停止重试前允许的最大尝试次数。若最后一次尝试仍抛出异常,系统将抛出该异常并终止运行,默认值为5次。


@retry(stop_max_attempt_number=5)
def run():
  print("开始重试")
  raise NameError

if __name__ == '__main__':
  run()

此参数主要用于强调对总重试次数的限制。

stop_max_delay:设定最大总延迟时间(毫秒)。其含义是:若函数调用出现异常,系统将重复调用该函数,但所有重试操作的总耗时不得超过此设定值,默认值为100毫秒。


from retrying import retry
@retry(stop_max_delay=5000)
def run():
  print("开始重试")
  raise NameError
if __name__ == '__main__':
  run()

例如,若设置该参数为5000,则重试过程将持续最多5秒钟,无论期间尝试了多少次。此参数强调对总时间的控制。

wait_fixed:设定两次重试调用之间的固定等待时长(毫秒)。若函数抛出异常,系统将按此固定间隔重复调用,默认值为1000毫秒。


from retrying import retry
@retry(wait_fixed=2000)
def run():
  print("开始重试")
  raise NameError
if __name__ == '__main__':
  run()

此参数主要用于强调重试之间的固定间隔时间。

wait_random_min:设定两次重试调用之间等待时间的最小值(毫秒),默认值为0。

wait_random_max:设定两次重试调用之间等待时间的最大值(毫秒),默认值为1000毫秒。结合wait_random_min使用,可实现随机等待策略。

wait_incrementing_increment:设定每次重试后增加等待时间的增量值(毫秒),默认值为100毫秒。

wait_exponential_multiplier和wait_exponential_max:用于配置指数级增长的等待时间策略。系统计算两次重试间等待时间的公式为:2^previous_attempt_number * wait_exponential_multiplier,其中previous_attempt_number表示此前已进行的retry次数。若计算出的等待时间超过wait_exponential_max设定的上限,则后续所有重试间的等待时间均固定为wait_exponential_max。

retry_on_exception:接收一个自定义函数作为参数。若该函数判断当前抛出的异常属于指定类型并返回True,则执行重试;若不属于指定异常类型,则直接退出重试流程。


from retrying import retry
def run2(exception):
  return isinstance(exception, ZeroDivisionError)
@retry(retry_on_exception=run2)
def run():
  print("开始重试")
  a = 1 / 0
if __name__ == '__main__':
  run()

retry_on_result:接收一个自定义函数作为参数。若该函数判断函数的返回值满足特定条件(如返回True)则执行重试,否则抛出异常并退出。


from retrying import retry
def run2(r):
  return isinstance(r, int)
@retry(retry_on_result=run2)
def run():
  print("开始重试")
  a = 1
  return a
if __name__ == '__main__':
  run()

wrap_exception:布尔参数,设为True或False。若设为True,当捕获到指定异常类型时,该异常将被包裹在RetryError中抛出,此时用户可见的异常信息将同时包含RetryError和原始程序抛出的Exception错误信息。

stop_func:指定一个在每次抛出异常时都会执行的回调函数。若同时使用了stop_max_delay或stop_max_attempt_number,stop_func的优先级更高,后两者将失效。

自定义的stop_func函数需接收两个参数:attempts(当前尝试次数)和delay(当前累计延迟时间)。

wait_func:其用法与stop_func类似,用于自定义等待时间的计算逻辑,此处不再赘述。

以上内容涵盖了retrying模块的核心使用方法与参数配置,希望对读者理解Python重试机制有所帮助。欢迎大家继续支持本站获取更多技术资源。

本站声明

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

Python 相关产品和应用

全部下载

专题列表