Python项目中requests出错重试怎么回事,如何解决
Admin 2022-07-06 群英技术资讯 989 次浏览
这篇文章主要讲解了“Python项目中requests出错重试怎么回事,如何解决”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Python项目中requests出错重试怎么回事,如何解决”吧!对python3下的requests使用并不是很熟练,今天稍微用了下,请求几次下来后发现出现连接超时的异常,上网查了下,找到了一个还算中肯的解决方法。
retrying是python的一个自带的重试包
from retrying import retry
retrying 这个包的用法原理就是在你不知道那段代码块是否会发生异常,若发生异常,可以再次执行该段的代码块,如果没有发生异常,那么就继续执行往下执行代码块
以前你的代码可能是这样写的:
def get_html(url): pass def log_error(url): pass url = "" try: get_page(url) except: log_error(url)
也有可能是这样子写的:
# 请求超过十次就放弃 attempts = 0 success = False while attempts < 10 and not success: try: get_html(url) success = True except: attempts += 1 if attempts == 10: break
使用 retrying 的写法:
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!"
result = do_something_unreliable()
print(result)
上面的是简单的用法,你可以试下,下面是一些可选参数的使用方式。
stop_max_attempt_number
用来设定最大的尝试次数,超过该次数就停止重试
stop_max_delay
超过时间段,函数就不会再执行了
wait_random_min和wait_random_max
用随机的方式产生两次retrying之间的停留时间
补充:python中Requests的重试机制
import requests
from requests.adapters import HTTPAdapter
s = requests.Session()
# 重试次数为3
s.mount('http://', HTTPAdapter(max_retries=3))
s.mount('https://', HTTPAdapter(max_retries=3))
# 超时时间为5s
s.get('http://example.com', timeout=5)
在wiki当中对指数退避算法的介绍是:
In a variety of computer networks, binary exponential backoff or truncated binary exponential backoff refers to an algorithm used to space out repeated retransmissions of the same block of data, often as part of network congestion avoidance.
翻译成中文的意思大概是“在各种的计算机网络中,二进制指数后退或是截断的二进制指数后退使用于一种隔离同一数据块重复传输的算法,常常做为网络避免冲突的一部分”
比如说在我们的服务调用过程中发生了调用失败,系统要对失败的资源进行重试,那么这个重试的时间如何把握,使用指数退避算法我们可以在某一范围内随机对失败的资源发起重试,并且随着失败次数的增加长,重试时间也会随着指数的增加而增加。
当然,指数退避算法并没有人上面说的那么简单,想具体了解的可以具体wiki上的介绍
当系统每次调用失败的时候,我们都会产生一个新的集合,集合的内容是0~2n-1,n代表调用失败的次数
第一次失败 集合为 0,1
第二次失败 集合为 0,1,2,3
第三次失败 集合为 0,1,2,3,4,5,6,7
在集合中随机选出一个值记为R,下次重试时间就是R*基本退避时间(对应在指数退避算法中争用期) 当然,为了防止系统无限的重试下去,我们会指数重新的最大次数
使用指数退避算法,可以防止连续的失败,从某方面讲也可以减轻失败服务的压力,试想一下,如果一个服务提供者的服务在某一时间发生了异常、超时或是网络抖动,那么频繁的重试所得到的结果也大致都是失败。这样的频繁的重试不仅没有效果,反而还会增服务的负担。
接入三方支付服务,在三方支付提供的接入接口规范中,服务方交易结束结果通知和商户主动查询交易结果都用到重发机制
在app应用中,很多场景会遇到轮询一类的问题,轮询对于app性能和电量的消耗都过大。


免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
这篇文章主要为大家介绍了python神经网络学习数据增强及预处理示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
这篇文章介绍了Python使用RSA库加密和解密的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
本篇文章给大家带来了关于Python的相关知识,详细介绍了Python实现提取四种不同文本特征的方法,有字典文本特征提取、英文文本特征提取、中文文本特征提取和TF-IDF 文本特征提取,感兴趣的可以了解一下。
如果你经历过数据清洗的过程,你就会明白我的意思。而这正是撰写这篇文章的目的让读者更轻松地进行数据清洗工作。事实上,我在不久前意识到,在进行数据清洗时,有一些数据具有相似的模
如何删除python字符串中指定的字符?方法一,使用pop()方法删除特定位置的字符;方法二,使用replace()方法删除指定字符,方法三,使用re.sub()方法可以替换特定模式的字符
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008