• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    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)

    执行结果:

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

    运行结果如下:

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

    特别需要注意的是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参数类似。
    我们可以根据自己的需要进行合理的搭配这些参数,达到我们想要的效果。

    到此这篇关于Python retrying 重试机制的使用方法的文章就介绍到这了,更多相关Python retrying 重试机制内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 

    您可能感兴趣的文章:
    • python爬虫URL重试机制的实现方法(python2.7以及python3.5)
    上一篇:OpenCV半小时掌握基本操作之图像处理
    下一篇:OpenCV半小时掌握基本操作之图像裁剪融合
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    Python retrying 重试机制的使用方法 Python,retrying,重试,机制,