广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Python retrying 重试机制详解
  • 650
分享到

Python retrying 重试机制详解

2024-04-02 19:04:59 650人浏览 安东尼

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参数类似。

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

总结

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

--结束END--

本文标题: Python retrying 重试机制详解

本文链接: https://www.lsjlt.com/news/158394.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Python retrying 重试机制详解
    目录循环加判断retrying总结 我们在程序开发中,经常会需要请求一些外部的接口资源,而且我们不能保证每次请求一定会成功,所以这些涉及到网络请求的代码片段就需要加上重试机制。下面来...
    99+
    2022-11-12
  • Python retrying 重试机制的使用方法
    目录循环加判断 retrying 我们在程序开发中,经常会需要请求一些外部的接口资源,而且我们不能保证每次请求一定会成功,所以这些涉及到网络请求的代码片段就需要加上重试机制。下面来说...
    99+
    2022-11-12
  • Python中retrying重试机制的示例分析
    这篇文章主要介绍了Python中retrying重试机制的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。循环加判断最简单的重试方式就是在需要进行重试的代码片段上加一个...
    99+
    2023-06-21
  • 一文详解Python中的重试机制
    目录介绍1. 最基本的重试2. 设置停止基本条件3. 设置何时进行重试4. 重试后错误重新抛出5. 设置回调函数介绍 为了避免由于一些网络或等其他不可控因素,而引起的功能性问题。比如...
    99+
    2022-11-11
  • python中可以发生异常自动重试库retrying
    目录1、前言2、快速开始2.1、安装retrying2.2、模拟无限重试2.3、模拟最大重试次数2.4、模拟最大重试时间2.5、模拟重试间隔时间2.6、指定重试调用的方法2.7、指定...
    99+
    2022-11-13
  • Vue超详细讲解重试机制示例
    重试指的是当加载出错时,有能力重新发起加载组件的请求。 异步组件加载失败后的重试机制,与请求服务端接口失败后的重试机制一样。所以,先来讨论接口请求失败后的重试机制是如何实现的, 为此...
    99+
    2023-01-05
    Vue重试机制 Vue重试
  • 什么是Python重试机制
    这篇文章主要讲解了“什么是Python重试机制”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“什么是Python重试机制”吧!为了避免由于一些网络或等其他不可控因素,而引起的功能性问题。比如在...
    99+
    2023-06-16
  • RocketMq消息重试机制及死信队列详解
    目录生产者消息重试消费者消息重试并发消费顺序消费并发消费和顺序消费区别死信队列实践出真知公共部分创建测试并发消费并发消费状态测试顺序消费顺序消费状态测试死信队列死信队列特性生产者消息...
    99+
    2022-11-13
  • Python重试库 Tenacity详解(推荐)
    目录1 Tenacity描述2 如果发生异常就重试3 设置停止重试的条件设置重试的最大次数还可以设置stop 时间停止重试条件 进行组合4 设置重试的间隔5 重试触发的条件针对具体的...
    99+
    2022-11-11
  • JS面试之异步模拟超时重传机制详解
    目录引言题目分析代码设计核心讲解引言 前面我讲解了两篇有关异步的逻辑思维题目,一个是红绿灯转换,还有一个是异步并发限制。有小伙伴私信我说不过瘾,希望还能再出一篇异步超时重传的讲解。为...
    99+
    2022-11-13
  • 【重试】Java 中的 7 种重试机制
    随着互联网的发展项目中的业务功能越来越复杂,有一些基础服务我们不可避免的会去调用一些第三方的接口或者公司内其他项目中提供的服务,但是远程服务的健壮性和网络稳定性都是不可控因素。在测试阶段可能没有什么异常情况,但上线后可能会出现调用的接口因为...
    99+
    2023-08-21
    java php 开发语言
  • HttpClient连接池及重试机制解析
    目录一、HttpClient简介功能介绍使用方法二、HttpClientUtil2.1HttpClient版本2.2项目中用到的工具类如下2.3笔者着重说一下http连接池三、Htt...
    99+
    2022-11-13
  • Python中import机制详解
    Python语言中import的使用很简单,直接使用 import module_name 语句导入即可。这里我主要写一下"import"的本质。 Python官方 定义:Python code in on...
    99+
    2022-06-04
    详解 机制 Python
  • Python中异常重试的解决方案详解
    前言 大家在做数据抓取的时候,经常遇到由于网络问题导致的程序保存,先前只是记录了错误内容,并对错误内容进行后期处理。 原先的流程: def crawl_page(url): pass def l...
    99+
    2022-06-04
    重试 详解 异常
  • 详解bash中的脚本调试机制
    以调试模式运行脚本 通过bash -x <script>的方式可以在调试模式下运行整个脚本, bash会在在运行前打印出了每一行命令, 而且每行前面用+号表明命令的嵌套层数. > bash -x ...
    99+
    2022-06-04
    bash 脚本调试
  • python的广播机制详解
    目录为什么会有广播机制在矩阵或向量相关运算中的广播机制1、一般的运算2、一个矩阵一个向量的情况3、两个向量4、矩阵乘法的广播机制总结为什么会有广播机制 python语言在设计的时候,...
    99+
    2022-11-12
  • kafka的重试机制和ack机制是什么
    Kafka的重试机制是指在消息发送过程中,如果发送失败或者出现异常,Kafka会自动尝试重新发送消息。重试机制的目的是确保消息能够成...
    99+
    2023-10-26
    kafka
  • RocketMQ消息重试机制原理分析讲解
    目录一、概述二、生产端的消息重试三、消费端的消息重试四、消息重试次数五、消息重试配置六、消息重试原理一、概述 由于网络抖动、服务宕机等一些不确定的因素,RocketMQ在发送消息的时...
    99+
    2023-02-13
    RocketMQ消息重试机制 RocketMQ消息重试
  • SpringRetry重试实例详解
    spring-retry是什么? spring-retry是spring提供的一个重试框架,原本自己实现的重试机制,现在spring帮封装好提供更加好的编码体验。 重试的使用场景比较...
    99+
    2022-11-13
    Spring Retry 重试 Spring Retry 重试机制
  • Python自动化测试之异常处理机制实例详解
    目录一、前言二、异常处理合集2.1 异常处理讲解2.2 异常捕获2.3 异常捕获原理2.4 特定异常捕获2.5 异常捕获的处理2.6 except、Exception与BaseExc...
    99+
    2022-11-11
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作