gpt4 book ai didi

Python retrying 重试机制详解

转载 作者:qq735679552 更新时间:2022-09-28 22:32:09 31 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章Python retrying 重试机制详解由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.

我们在程序开发中,经常会需要请求一些外部的接口资源,而且我们不能保证每次请求一定会成功,所以这些涉及到网络请求的代码片段就需要加上重试机制。下面来说一下Python中的重试方法.

循环加判断

最简单的重试方式就是在需要进行重试的代码片段上加一个循环,程序内捕获异常,如果执行成功就退出循环,执行失败就就重复执行相关代码,例如:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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)

执行结果:

Python retrying 重试机制详解

由于请求了一个不存在的网址,所以一直在重试,知道达到最大次数10次。但是这样有一定的代码侵入性,在业务逻辑上加入循环判断显得很不美观,别着急,往下看,还有更好的方法.

retrying

retrying是Python的一个第三方库,它提供一个装饰器函数retry,被装饰的业务函数就会在运行失败的条件下重新执行,默认只要报错就会一直重试,直至执行成功.

可以使用pip install retrying进行安装.

例如下面一段代码,我们使用生成随机数的大小的方式模拟业务的成功与失败,只要是生成的随机数大于2,都视为失败,就会重试,直到生成的随机数小于2:

?
1
2
3
4
5
6
7
8
9
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()

运行结果如下:

Python retrying 重试机制详解

retry还可以接受一些参数,下面是源码中Retrying类的初始化函数中可选的参数:

Python 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参数,它接收一个函数,用法如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 判断异常
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://blog.csdn.net/weixin_50097774/article/details/121477820 。

最后此篇关于Python retrying 重试机制详解的文章就讲到这里了,如果你想了解更多关于Python retrying 重试机制详解的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com