python3解决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
random在python中的意思
@retry()
def do_something_unreliable():
if random.randint(0, 10) > 1:
raise IOError("Broken sauce, everything is hosed111one")
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
# 超时时间为5s
<('example', 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性能和电量的消耗都过⼤。
代码⽰例
以上为个⼈经验,希望能给⼤家⼀个参考,也希望⼤家多多⽀持。如有错误或未考虑完全的地⽅,望不吝赐教。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论