python3 解决requests出错重试的问题
作者:xudailong_blog 发布时间:2021-02-05 10:26:27
对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的重试机制
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)
requests使用的重试算法:BackOff(指数退避算法)
什么是指数退避算法
在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性能和电量的消耗都过大。
代码示例
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。如有错误或未考虑完全的地方,望不吝赐教。
来源:https://blog.csdn.net/xudailong_blog/article/details/82469380
猜你喜欢
- 数据库操作类的优点优点可以说是非常多了,常见的优点就是便于维护、复用、高效、安全、易扩展。例如PDO支持的数据库类型是非常多的,与mysql
- 用户认证组件:功能:用session记录登录验证状态前提:用户表:django自带的auth-userpython3 manage.py c
- 在找工作的时候,我们会选择上网查询招聘的信息,或者是通过一些招聘会进行现场面试。但由于信息更新不及时,有一些岗位会出现下架的情况,如果我们不
- 说来惭愧,以前在去掉数组的空值是都是强写foreach或者while的,利用这两个语法结构来删除数组中的空元素,简单代码如下:<?ph
- 我就废话不多说了,直接上代码吧!#方法一def list_cut(mylist,count): length=len(mylis
- 背景:pony是公司的首席体验官、首席产品经理。这次在产品峰会上pony将自己平时经验的积累与大家交流,体验较细。这次分享研发管理部,设计中
- 本文实例讲述了Python3搜索及替换文件中文本的方法。分享给大家供大家参考。具体实现方法如下:# 将文件中的某个字符串改变成另一个 # 下
- MongoDB已经使用很长一段时间了,基于MongoDB的数据存储也一直没有使用到权限访问(MongoDB默认设置为无权限访问限制),今天特
- JavaScript Length 字符长度函数,在很多时间我们会用length函数了,因为你得前台判断一个用户输入
- LRULRU(Least recently used,最近最少使用)算法根据数据的历史访问记录来进行淘汰数据,其核心思想是“如果数据最近被访
- 现在拥有了正则表达式这把神兵利器,我们就可以进行对爬取到的全部网页源代码进行筛选了。下面我们一起尝试一下爬取内涵段子网站:http://ww
- 如果你想把Python嵌入C/C++中是比较简单的事情,你需要的是在VC中添加Python的include文件目录和lib文件目录。下面我们
- 获取不带扩展名的文件的名称:import osprintos.path.splitext("path_to_file")
- 外联接。外联接可以是左向外联接、右向外联接或完整外部联接。 在 FROM 子句中指定外联接时,可以由下列几组关键字中的一组指定:LEFT J
- 孟宪会 由于XML(可扩展标记语言:eXtensible Markup Language)真正的平台无关性,它正在逐渐成为数据传
- codecs在读取文件时,发生错误:UnicodeDecodeError: 'utf-8' codec can't
- 互联网充斥着枯燥的设计,惠普、IBM、戴尔、微软,以及其他数不尽的网站(相似的布局,相似的配色)。可能有人会说通过这样一种标准化的界面可以使
- 一、类和对象通俗理解:类就是模板,对象就是通过模板创造出来的物体类(Class)由3个部分构成:类的名称: 类名类的属性: 一组数据类的方法
- 我还我还是有必要改一个标题,(原题为 让你想不通的"bug"),以免有同学误会。先看代码。看完之后我有个问题提问一下,看
- 一、控制用户存取 1、创建修改用户Creating Users Create/alter user new_user identified