Python中retrying重试机制的示例分析
这篇文章主要介绍了Python中retrying重试机制的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。
循环加判断
最简单的重试方式就是在需要进行重试的代码片段上加一个循环,程序内捕获异常,如果执行成功就退出循环,执行失败就就重复执行相关代码,例如:
import requestsdef 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 randomfrom retrying import retry@retrydef 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
:两次retrying之间的等待时间
wait_random_min
和wait_random_max
:用随机的方式产生两次retrying之间的等待时间
wait_incrementing_start
和wait_incrementing_increment
:每调用一次增加固定时长
wait_exponential_multiplier
和wait_exponential_max
:以指数的形式产生两次retrying之间的等待时间,产生的值为2^previous_attempt_number * wait_exponential_multiplier
,previous_attempt_number
是前面已经retry的次数,如果产生的这个值超过了wait_exponential_max
的大小,那么之后两个retrying之间的停留值都为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()
这里retry_on_exception
参数的大体思想是:接收一个自定义函数is_MyError
,在is_MyError
函数里判断了是不是属于ValueError
, IOError
, ConnectionError
这三种异常;random_with_retry()
函数如果抛出了异常,会去函数is_MyError()
判断返回的是True还是False,如果是True则继续重试,如果是False则立即停止并抛出异常。
还有retry_on_result
参数,也是接收一个函数,判断业务函数返回哪些结果时需要重试,思想和retry_on_exception
参数类似。
我们可以根据自己的需要进行合理的搭配这些参数,达到我们想要的效果。
感谢你能够认真阅读完这篇文章,希望小编分享的“Python中retrying重试机制的示例分析”这篇文章对大家有帮助,同时也希望大家多多支持编程网,关注编程网行业资讯频道,更多相关知识等着你来学习!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341