Python中异常重试的解决方案详解
本文深入解析Python中处理网络波动或程序崩溃的异常重试方案。重点介绍retrying库的使用,涵盖装饰器@retry的基本用法,以及stop_max_attempt_number、wait_fixed、wait_exponential等关键参数的配置。通过示例演示如何根据特定异常或返回值智能控制重试逻辑,结合指数退避算法优化系统性能。
前言
在进行数据抓取任务时,开发者常因网络不稳定导致程序运行中断。早期的处理策略通常仅记录错误信息,并在事后进行人工或脚本干预,缺乏自动恢复机制。
原先的流程:
def crawl_page(url): pass def log_error(url): pass url = "" try: crawl_page(url) except: log_error(url)
改进后的流程:
attempts = 0 success = False while attempts < 3 and not success: try: crawl_page(url) success = True except: attempts += 1 if attempts == 3: break
近期发现了一种更为高效的解决方案:使用retrying库。
retrying是一个专为Python设计的功能包,旨在自动重试那些可能执行失败的代码片段。retrying库提供了一个装饰器函数retry,当被装饰的函数执行失败时,它会自动重新执行。默认配置下,只要持续报错,程序将无限次重试。
import random
from retrying import retry
@retry
def do_something_unreliable():
if random.randint(0, 10) > 1:
raise IOError("Broken sauce, everything is hosed!!!111one")
else:
return "Awesome sauce!"
print do_something_unreliable()若运行have_a_try函数,只要random.randint返回的数值不等于5,函数就会持续重新执行,直到满足条件为止。
retry装饰器支持多种参数配置,具体选项可通过查看Retrying类的初始化源码得知:
stop_max_attempt_number:用于设定最大尝试次数。一旦超过此限制,系统将停止重试并抛出最终异常。stop_max_delay:例如设置为10000(毫秒),表示从被装饰函数开始执行到成功结束或失败中止的整个时间段。若该时间超过10秒,函数将不再执行。wait_fixed:用于设定两次retrying之间的固定等待时间(毫秒)。wait_random_min和wait_random_max:通过随机方式生成两次retrying之间的等待时间,范围在wait_random_min和wait_random_max之间。wait_exponential_multiplier和wait_exponential_max:以指数形式生成两次retrying之间的等待时间,计算公式为2^previous_attempt_number * wait_exponential_multiplier,其中previous_attempt_number代表此前已经retry的次数。若计算出的值超过wait_exponential_max设定的上限,后续两次重试之间的等待时间将固定为wait_exponential_max。这种设计遵循了exponential backoff算法,有助于减轻服务器阻塞压力。- 我们可以指定仅在出现特定异常时才触发重试,这需要传入一个函数对象给
retry_on_exception参数:
def retry_if_io_error(exception):
return isinstance(exception, IOError)
@retry(retry_on_exception=retry_if_io_error)
def read_a_file():
with open("file", "r") as f:
return f.read()在执行read_a_file函数过程中,若发生异常,该异常将作为形参exception传递给retry_if_io_error函数。如果exception属于IOError类型,则执行retry;否则,程序将停止重试并抛出原始异常。
此外,我们还可以指定仅在返回特定结果时才进行retry,这需要通过retry_on_result参数传入一个函数对象:
def retry_if_result_none(result): return result is None @retry(retry_on_result=retry_if_result_none) def get_result(): return None
当get_result函数执行成功后,其返回值将以形参result的形式传入retry_if_result_none函数。如果返回值是None,则继续执行retry;否则,程序结束并返回该函数值。
总结
以上即为本文的全部内容。希望这些关于Python异常重试方案的解析能对各位的学习或工作有所帮助。如有任何疑问,欢迎留言交流,感谢大家对本站的支持。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









