Python retrying 重试机制的使用方法
作者:tigeriaf 发布时间:2023-09-21 22:52:36
目录
循环加判断
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:两次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参数类似。
我们可以根据自己的需要进行合理的搭配这些参数,达到我们想要的效果。
来源:https://juejin.cn/post/6999444572011135007
猜你喜欢
- 进入sqlplus SQL> set timing on SQL> SQL> select count(*) from c
- 判断访问是否来自搜索引擎的函数,有兴趣的可以试试! <% '检查当前用户是否是蜘蛛人 Function check(
- 软删除简单的说,就是当执行删除操作的时候,不正真执行删除操作,而是在逻辑上删除一条记录。这样做的好处是可以统计数据,可以进行恢复操作等等。预
- 本文实例总结了php遍历目录方法。分享给大家供大家参考。具体如下:1. 方法1 <?p
- 如下所示:import pandas as pddf = pd.DataFrame([1, 2, 3, 4, 5], index=[10,
- Pythonpython 真的太好用了,但是它真的好慢啊(哭死) ; C++ 很快,但是真的好难写啊,此生能不碰它就不碰它。老天啊,有没有什
- FLV在线转换,是目前主流播客网上通用的一种视频解决方案需要用到的组件 ASPExecmencoderffmpeg.exe第一步骤: 在线转
- 初级的图像拼接为将两幅图像简单的粘贴在一起,仅仅是图像几何空间的转移与合成,与图像内容无关。高级图像拼接也叫作基于特征匹配的图像拼接,拼接时
- remove 删除单个元素,删除首个符合条件的元素,按值删除,返回值为空List_remove = [1, 2, 2, 2, 3, 4]pr
- 本文实例讲述了python函数enumerate,operator和Counter使用技巧。分享给大家供大家参考,具体如下:最近看人家的代码
- ORA-00600:internal error code,arguments:[num],[?],[?],[?],[?]产生原因:这种错误
- 一、Python不同版本的类Python2.2之前是没有共同的祖先的,之后引入Object类,它是所有类的共同祖先类ObjectPython
- 译注:开发人员如何从无休止的需求、项目进度中摆脱烦躁的心态,这是每个人都值得思考的话题。无意间看见了这篇文章,恐于太长遂将其精简翻译,错误之
- 欢欢喜喜辞旧岁 🐰🐰🐰辞旧迎新之际,来 AI Studio 一起 #欢喜迎兔年# !分享不同新年风俗,共享一段快乐时光!🐰🐰🐰p>下面
- 一. 代码使用Python+Splinter开发,Splinter是一个使用Python开发的开源Web应用测试工具,它可以帮你实
- 本文实例讲述了python实现将pvr格式转换成pvr.ccz的方法。分享给大家供大家参考。具体实现方法如下:import zlibimpo
- 本文实例讲述了php中使用key,value,current,next和prev函数遍历数组的方法。分享给大家供大家参考。具体分析如下:ph
- 这样做的好处是:利用表格来装载数据,不言而喻是最好的,你可以很灵活的为每个单元格定义样式。下面是具体的做法首先在photoshop设计一个效
- 文字的多行处理在dom元素中很好办。但是canvas中没有提供方法,只有通过截取指定字符串来达到目的。那么下面就介绍我自己处理的办法:wxm
- 一、前言随着三胎政策的开放,人们对于生娃的讨论也逐渐热烈了起来,经常能够在各大社交媒体当中看到相关的话题,而随着时间慢慢地流逝,中国的首批“