Python retrying 重试机制的使用方法_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类的初始化函数中可选的参数:

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

# 判断异常
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)

  • 本文相关:
  • python字符遍历的艺术
  • python3+opencv生成不规则黑白mask实例
  • python3实现的回文数判断及罗马数字转整数算法示例
  • 使用python的urllib2模块处理url和图片的技巧两则
  • jupyter notebook 如何修改字体和大小以及更改字体样式
  • python数据分析之员工个人信息可视化
  • 详解python3注释知识点
  • python中的列表生成式与生成器学习教程
  • python框架flask入门之环境搭建及开启调试
  • django rest framework权限的详细用法
  • python的分布式任务huey如何实现异步化任务讲解
  • HELP!名著《LOVE STORY》中文版翻译 !求网址!
  • HELP!名著《LOVE STORY》中文版翻译 !求网址!
  • 访问外部类的内部类在Python问题,怎么解决
  • 求泰勒斯威夫特Lovestory的歌词的中文版
  • Live Like You're Dying 这歌歌名歌词意思是什么
  • 西城男孩的《seasons in the sun》的中文版
  • wonder girl nobody!nobody 中文版音译。
  • 教我唱hereiam歌词,中文版
  • 芭比之钻石城堡中的歌曲哪有下载?中文版的
  • 吻别英文版的歌词、带上中文版的歌词
  • 求《Kiss》的中文版歌词
  • 网站首页网页制作脚本下载服务器操作系统网站运营平面设计媒体动画电脑基础硬件教程网络安全vbsdos/bathtahtcpythonperl游戏相关vba远程脚本coldfusionruby专题autoitseraphzonepowershelllinux shellluagolangerlang其它首页pythonpython爬虫url重试机制的实现方法(python2.7以及python3.5)python字符遍历的艺术python3+opencv生成不规则黑白mask实例python3实现的回文数判断及罗马数字转整数算法示例使用python的urllib2模块处理url和图片的技巧两则jupyter notebook 如何修改字体和大小以及更改字体样式python数据分析之员工个人信息可视化详解python3注释知识点python中的列表生成式与生成器学习教程python框架flask入门之环境搭建及开启调试django rest framework权限的详细用法python入门教程 超详细1小时学会pycharm 2020最新永久激活码(附python 列表(list)操作方法详解python 元组(tuple)操作详解python 字典(dictionary)操作详解pycharm 2020年最新激活码(亲测python strip()函数 介绍pycharm 使用心得(一)安装和首python中使用xlrd、xlwt操作excepython 中文乱码问题深入分析python django框架单元测试之文件上传测试pygame游戏之旅 添加icon和bgm音效的方法python3使用requests发闪存的方法queue 实现生产者消费者模型(实例讲解)python 自动化常用操作及glob使用大全python selenium cookie 绕过验证码实现登python实现点阵字体读取与转换的方法用python编写简单的微博爬虫基于pycharm导入模块显示不存在的解决方法python交互界面的退出方法
    免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2017 www.zgxue.com All Rights Reserved