Python retrying模块重试机制详解与参数配置
本文详细介绍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重试机制有所帮助。欢迎大家继续支持本站获取更多技术资源。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













