Python retrying 重试机制详解

 更新时间:2021年11月25日 14:24:28   作者:程序员-夏天  
这篇文章主要为大家介绍了Python 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)

执行结果:

image.png

由于请求了一个不存在的网址,所以一直在重试,知道达到最大次数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()

运行结果如下:

image.png

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

stop_max_attempt_number:最大重试次数,超过该次数就停止重试

stop_max_delay:最大延迟时间(执行这个方法重试的总时间),超过该时间就停止

wait_fixed:两次retrying之间的等待时间

wait_random_minwait_random_max:用随机的方式产生两次retrying之间的等待时间

wait_incrementing_startwait_incrementing_increment:每调用一次增加固定时长

wait_exponential_multiplierwait_exponential_max:以指数的形式产生两次retrying之间的等待时间,产生的值为2^previous_attempt_number * wait_exponential_multiplierprevious_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参数类似。

我们可以根据自己的需要进行合理的搭配这些参数,达到我们想要的效果。

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注脚本之家的更多内容!

相关文章

  • matplotlib subplots 设置总图的标题方法

    matplotlib subplots 设置总图的标题方法

    今天小编就为大家分享一篇matplotlib subplots 设置总图的标题方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-05-05
  • 动态创建类实例代码

    动态创建类实例代码

    Python中要创建一个类的实例,要首先导入该类或者该类所属的模块。
    2009-10-10
  • 手把手教你Python yLab的绘制折线图的画法

    手把手教你Python yLab的绘制折线图的画法

    这篇文章主要介绍了手把手教你Python yLab的绘制折线图的画法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-10-10
  • Python+tkinter实现制作文章搜索软件

    Python+tkinter实现制作文章搜索软件

    无聊的时候做了一个搜索文章的软件,有没有更加的方便快捷不知道,好玩就行了。软件是利用Python和tkinter实现的,感兴趣的可以尝试一下
    2022-10-10
  • 利用Python自动化操作AutoCAD的实现

    利用Python自动化操作AutoCAD的实现

    这篇文章主要介绍了利用Python自动化操作AutoCAD的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-04-04
  • 使用python快速在局域网内搭建http传输文件服务的方法

    使用python快速在局域网内搭建http传输文件服务的方法

    这篇文章主要介绍了使用 python快速在局域网内搭建http传输文件服务,但是这种方法不要传输机密文件,安全性不高,只用到http协议没有使用任何加密协议,具体实现方法跟随小编一起看看吧
    2019-11-11
  • Python探索之pLSA实现代码

    Python探索之pLSA实现代码

    偶然看到了pLSA模型这个东东,不懂,于是找了找资料,这里分享给大家一段代码,帮助理解吧。不好的地方还请多多指教。
    2017-10-10
  • pandas删除行删除列增加行增加列的实现

    pandas删除行删除列增加行增加列的实现

    这篇文章主要介绍了pandas删除行删除列增加行增加列的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-07-07
  • Pycharm中配置Anaconda解释器的完整步骤

    Pycharm中配置Anaconda解释器的完整步骤

    Anaconda是Python的一个发行版本,集成了大量插件,在用PyCharm进行开发时,可以选用Anaconda执行环境,下面这篇文章主要给大家介绍了关于Pycharm中配置Anaconda解释器的完整步骤,需要的朋友可以参考下
    2022-11-11
  • python 实现的IP 存活扫描脚本

    python 实现的IP 存活扫描脚本

    这篇文章主要介绍了python 实现的IP 存活扫描脚本,帮助大家更好的理解和使用python,感兴趣的朋友可以了解下
    2020-12-12

最新评论