python之Tenacity重试库的使用

news/2024/4/19 6:49:40/文章来源:https://blog.csdn.net/qq233325332/article/details/129098146

Tenacity 是一个用于 Python 的重试库,它提供了一种简单的方法来在出现错误时自动重试代码,以便增加代码的健壮性和可靠性。下面是使用 Tenacity 的一些基本步骤:

安装 Tenacity:

pip install tenacity

导入 Tenacity 模块:

from tenacity import retry, stop_after_attempt, wait_fixed

为需要重试的函数添加装饰器:

@retry(stop=stop_after_attempt(3), wait=wait_fixed(1))
def my_function():# 函数体

在上面的代码中,retry装饰器告诉 Tenacity 在出现异常时重试该函数。stop_after_attempt(3) 意味着在第 3 次尝试后停止重试,wait_fixed(1) 表示在每次重试之间等待 1 秒钟。

调用重试函数:

my_function()

当 my_function 函数在前三次尝试都失败后,Tenacity 将抛出 tenacity.RetryError 异常。

在 Tenacity 中,有几种不同的重试策略可以使用,以下是常用的几种重试方法:

  1. stop_after_attempt(attempts)
    在给定的尝试次数之后停止重试。

  2. stop_after_delay(delay)
    在给定的时间后停止重试。

  3. stop_never()
    从不停止重试,这是默认的策略。

  4. wait_fixed(interval)
    在每次重试之间等待固定的时间间隔。

  5. wait_random(min_wait, max_wait)
    在每次重试之间等待介于最小等待时间和最大等待时间之间的随机时间。

  6. wait_exponential(multiplier, max_wait=None)
    在每次重试之间等待指数级增长的时间间隔。重试间隔将为 multiplier ** n,其中 n 是重试次数。

  7. retry_if_exception_type(*exception_types)
    当捕获指定的异常类型时,才进行重试。

  8. retry_if_result(predicate)
    当指定的函数谓词返回 True 时,才进行重试。predicate 应该是一个接受一个参数的函数,该参数为函数的返回值。

这些重试策略可以组合在一起使用,以实现更复杂的重试逻辑。例如,可以使用wait_randomretry_if_exception_type来创建一个随机化的重试机制,以避免在重试时出现时间同步问题。

下面是使用 Tenacity 的几个示例,涵盖了不同的重试策略:

  1. 使用stop_after_attempt策略,在尝试 3 次之后停止重试:
from tenacity import retry, stop_after_attempt@retry(stop=stop_after_attempt(3))
def my_function():# 函数体
  1. 使用wait_fixed策略,在每次重试之间等待 1 秒钟:
from tenacity import retry, stop_after_attempt, wait_fixed@retry(stop=stop_after_attempt(3), wait=wait_fixed(1))
def my_function():# 函数体
  1. 使用wait_random策略,在每次重试之间等待介于 1 秒钟和 3 秒钟之间的随机时间:
from tenacity import retry, stop_after_attempt, wait_random@retry(stop=stop_after_attempt(3), wait=wait_random(1, 3))
def my_function():# 函数体
  1. 使用retry_if_exception_type策略,在出现 IOError 或 OSError 异常时重试:
from tenacity import retry, retry_if_exception_type@retry(retry=retry_if_exception_type((IOError, OSError)))
def my_function():# 函数体
  1. 使用wait_exponential策略,在每次重试之间等待指数级增长的时间间隔:
from tenacity import retry, wait_exponential@retry(wait=wait_exponential(multiplier=1, max_wait=60))
def my_function():# 函数体

在这个示例中,my_function将会在第一次重试时等待 1 秒钟,然后在第二次重试时等待 2 秒钟,第三次重试时等待 4 秒钟,以此类推,直到最大等待时间为 60 秒。可以通过调整 multiplier 参数来控制每次等待的增长速度。通常,建议将 multiplier 设置为1,这将使每次等待时间加倍。如果您想使等待时间增长得更快,可以将 multiplier 设置为一个大于 1 的值。

  1. 使用stop_after_delay策略的示例,该策略会在指定的时间内停止重试:
from tenacity import retry, stop_after_delay@retry(stop=stop_after_delay(30)) # 在 30 秒之后停止重试
def my_function():# 函数体
  1. 如果您不指定任何 retry 的参数,则 Tenacity 将使用默认的策略,该策略永远不会停止重试:
from tenacity import retry, stop_never@retry # 永远不会停止重试
def my_function():# 函数体

在这个示例中,my_function 将会无限重试,直到成功。这通常不是一个好的策略,因为如果函数出现无法恢复的错误,它将永远重试。但是,在某些情况下,这可能是需要的,例如当函数执行时间非常短且您想最大化成功的机会时。请注意,当您使用 stop_never 策略时,Tenacity 将无限重试,直到您在程序中使用 KeyboardInterrupt 或其他方法明确停止它。因此,在使用此策略时,请确保在代码中包含一个明确的停止条件。

KeyboardInterrupt 是 Python 中的一个异常类型,当用户按下 Ctrl+C 键时,Python 解释器会引发此异常。它通常用于中断正在运行的程序,以便用户可以更改程序的行为或停止程序。

在使用 Tenacity 时,您可以捕获 KeyboardInterrupt 异常以便在需要时优雅地停止重试操作。例如,下面的代码示例演示了如何捕获 KeyboardInterrupt 异常并在重试之间等待 1 秒钟:

from tenacity import retry, wait_fixed
import time@retry(wait=wait_fixed(1))
def my_function():try:# 函数体passexcept KeyboardInterrupt:print("用户中断时停止...")

在这个示例中,my_function将捕获 KeyboardInterrupt 异常,并在用户按下 Ctrl+C 时打印一条消息。捕获异常可以确保程序在退出时优雅地处理资源并停止重试操作。

这些示例只是 Tenacity 可以实现的不同重试策略的一部分,可以根据具体的需求进行组合使用。


  • 📢博客主页:https://blog.csdn.net/qq233325332
  • 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!
  • 📢本文由 陌北V1 原创,首发于 CSDN博客🙉
  • 📢停下休息的时候不要忘了别人还在奔跑,希望大家抓紧时间学习,全力奔赴更美好的生活✨

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_71717.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[ vulhub漏洞复现篇 ] Drupal 远程代码执行漏洞(CVE-2019-6339)

🍬 博主介绍 👨‍🎓 博主介绍:大家好,我是 _PowerShell ,很高兴认识大家~ ✨主攻领域:【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 🎉点赞➕评论➕收藏 养成习…

java final关键字 详解

概述:作用:细节:演示:总结:一、概述 : final [ˈ faɪnl],最终的,最后的,决定性的,不可改变的。final作为Java中的一个关键字可以用来修饰类,方法&#xff0c…

Vbs_To_Exe制作简易exe程序

文章目录一、准备vbs脚本文件二、工具打包exe一、准备vbs脚本文件 新建一个文本文档 复制下面代码到文本文档中 Set speech CreateObject("SAPI.SpVoice") speech.Speak "l love you!"修改文本后缀为.vbs。编码选择ANSI(解决中文乱码问题&am…

LVS中的keepalived高可用

文章目录前言一、Keepalived简介二、keepalived工作原理三、配置文件四、实验1.某台Real Server down2.LVS本身down实验过程:五、代码详细演示整体过程调度器安装软件、设置测试keepalived对后端RS的健康检测backup服务主机设置前言 一、Keepalived简介 Keepalived是…

UG NX二次开发(C#)-导出-导出Parasolid文件(.x_t文件)

文章目录 1、前言2、在UG NX中的操作2、采用NXOpen二次开发实现1、前言 UG NX提供了多种文件的导入与导出功能,本文采用NXOpen.net来实现Parasolid文件(.x_t文件)的导出功能。 2、在UG NX中的操作 打开UG NX的一个三维模型,如下图所示。 点击“文件”->“导出”->“…

企业级信息系统开发学习笔记1.2 初探Spring——利用组件注解符精简Spring配置文件

文章目录零、本讲学习目标一、课程引入二、打开项目 - SpringDemo三、利用组件注解符精简Spring配置文件(一)创建新包(二)复制四个类(三)修改杀龙任务类(四)修改救美任务类&#xff…

html常用font-family设置字体样式

<table border"1" cellpadding"0" cellspacing"0" ><tr><td><h3 style"font-family: 黑体;">黑体&#xff1a;SimHei</h3></td><td><h3 style"font-family: 华文黑体;">华…

Prometheus集群分布式架构浅析

集群行为是一种常见于自然界中鱼群、鸟群、蜂群等低等群居生物的集体行为&#xff0c;受此启发形成了无人机集群的概念。无人机集群不是多无人机间的简单编队&#xff0c;而是通过必要的控制策略使之产生集群协同效应&#xff0c;从而具备执行复杂多变、危险任务的能力。目前无…

如何快速、全面、深入地掌握一门编程语言

思考路线 如何快速&#xff1f; 什么样的Demo才能让人觉得你掌握了它&#xff1f; 空 判断&#xff1a;构造一个可以判断所有空的 is_empty 函数 for 循环&#xff1a;i 和 集合迭代两种 时间获取&#xff1a;年/月/日 时分秒 时间戳与时间格式互转 休眠时间函数 字符串处理…

Word控件Spire.Doc 【Table】教程(17):如何在 C#、VB.NET 中删除 Word 表格中的行和列

Spire.Doc for .NET是一款专门对 Word 文档进行操作的 .NET 类库。在于帮助开发人员无需安装 Microsoft Word情况下&#xff0c;轻松快捷高效地创建、编辑、转换和打印 Microsoft Word 文档。拥有近10年专业开发经验Spire系列办公文档开发工具&#xff0c;专注于创建、编辑、转…

PCB设计中降低噪声与电磁干扰的24个窍门

电子设备的灵敏度越来越高&#xff0c;这要求设备的抗干扰能力也越来越强&#xff0c;因此PCB设计也变得更加困难&#xff0c;如何提高PCB的抗干扰能力成为众多工程师们关注的重点问题之一。本文将介绍PCB设计中降低噪声与电磁干扰的一些小窍门。 下面是经过多年设计总结出来的…

大数据处理学习笔记1.3 使用Scala集成开发环境

文章目录零、本讲学习目标一、搭建Scala的IntelliJ IDEA开发环境&#xff08;一&#xff09;启动IDEA&#xff08;二&#xff09;安装Scala插件&#xff08;三&#xff09;配置IDEA使用的默认JDK&#xff08;四&#xff09;创建Scala项目1、创建Scala项目 - ScalaDemo2、创建Sc…

linux高级命令之死锁

死锁学习目标能够知道产生死锁的原因1. 死锁的概念死锁: 一直等待对方释放锁的情景就是死锁为了更好的理解死锁&#xff0c;来看一个现实生活的效果图:说明:现实社会中&#xff0c;男女双方一直等待对方先道歉的这种行为就好比是死锁。死锁的结果会造成应用程序的停止响应&…

【vue】elemente-ui table toggleRowSelection 默认选择无效[已解决]

项目场景&#xff1a; 点击按钮&#xff0c;弹出一个弹出框&#xff0c;内部出现一个table表&#xff0c;表内数据是动态获取&#xff0c;同时得勾选上几个table表的数据&#xff0c;类似以下的图 问题描述 点击按钮显示弹出框&#xff0c;加载table中的数据&#xff0c;默…

【机器学习】Adaboost

1.什么是Adaboost AdaBoost&#xff08;adapt boost&#xff09;&#xff0c;自适应推进算法&#xff0c;属于Boosting方法的学习机制。是一种通过改变训练样本权重来学习多个弱分类器并进行线性结合的过程。它的自适应在于&#xff1a;被前一个基本分类器误分类的样本的权值会…

springboot整合Chat Generative Pre-trained Transformer

什么是Chat Generative Pre-trained Transformer Chat Generative Pre-trained Transformer&#xff0c;是以人工智能驱动的聊天机器人程序 &#xff0c;已经更新多个版本&#xff0c;很多大厂也都在接入其API。 整合难度 难度一颗星&#xff0c;基本上就是给官方API发请求&am…

在VMware Workstation中配置固定IP、在VMware Fusion中配置固定IP

1、在VMware Workstation中配置固定IP 配置固定IP需要2个大步骤&#xff1a; 1.在VMware Workstation&#xff08;或Fusion&#xff09;中配置IP地址网关和网段&#xff08;IP地址的范围&#xff09; 首先让我们&#xff0c;先进行第一步&#xff0c;跟随图片进行操作 现在进…

基于某业务单登陆场景并发测试实战

文章目录1 测试目的2 测试目标和测试对象3 名词解释4 测试说明5 测试环境和工具5.1 测试工具5.2 测试环境5.3 人力计划6 测试用例6.1 方案设计6.2 接口地址6.3 接口参数6.3.1 header参数6.3.2 请求参数7 脚本设计8 监控数据8.1 虚拟用户并发情况8.2 事务响应时间8.3 每秒点击次…

面试攻略,Java 基础面试 100 问(十二)

如何将字符串转换为基本数据类型&#xff1f; 调用基本数据类型对应的包装类中的方法 parseXXX(String)或 valueOf(String)即可返回相应基本类型&#xff1b; 如何将基本数据类型转换为字符串&#xff1f; 一种方法是将基本数据类型与空字符串&#xff08;””&#xff09;连…

微服务03 分布式搜索引擎 elasticsearch ELK kibana RestAPI RestClient

分布式搜索引擎01-- elasticsearch基础0.学习目标1.初识elasticsearch1.1.了解ES1.1.1.elasticsearch的作用elasticsearch是一款非常强大的开源搜索引擎&#xff0c;具备非常多强大功能&#xff0c;可以帮助我们从海量数据中快速找到需要的内容例如&#xff1a;在GitHub搜索代码…