返回顶部
首页 > 资讯 > 后端开发 > Python >Python中最强大的错误重试库(tenacity库)
  • 652
分享到

Python中最强大的错误重试库(tenacity库)

2024-04-02 19:04:59 652人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

目录1 简介2 tenacity中的常用功能2.1 tenacity的基础使用2.2 设置最大重试次数2.3 设置重试最大超时时长2.4 组合重试停止条件2.5 设置相邻重试之间的时

1 简介

我们在编写程序尤其是与网络请求相关的程序,如调用WEB接口、运行网络爬虫等任务时,经常会遇到一些偶然发生的请求失败的状况,这种时候如果我们仅仅简单的捕捉错误然后跳过对应任务,肯定是不严谨的,尤其是在网络爬虫中,会存在损失有价值数据的风险。

这类情况下我们就很有必要为我们的程序逻辑添加一些「错误重试」的策略,费老师我在几年前写过文章介绍过python中的retry库,但它功能较为单一,只能应对基本的需求。

而今天我要给大家介绍的tenacity库,可能是目前Python生态中最好用的错误重试库,下面就让我们一睹其主要功能吧~

2 tenacity中的常用功能

作为一个第三方Python库,我们可以使用pip install tenacity对其进行安装,安装完成后,下面我们来学习一下tenacity的主要使用方法和特性:

2.1 tenacity的基础使用

tenacity的错误重试核心功能由其retry装饰器来实现,默认不给retry装饰器传参数时,它会在其所装饰的函数运行过程抛出错误时不停地重试下去,譬如下面这个简单的例子:

import random
from tenacity import retry

@retry
def demo_func1():

    a = random.random()
    print(a)
    
    if a >= 0.1:
        raise Exception

demo_func1()

在这里插入图片描述

可以看到,我们的函数体内每次生成0到1之间的随机数,当这个随机数不超过0.1时才会停止抛出错误,否则则会被tenacity捕捉到每次的错误抛出行为并立即重试。

2.2 设置最大重试次数

有些时候我们对某段函数逻辑错误重试的忍耐是有限度的,譬如当我们调用某个网络接口时,如果连续n次都执行失败,我们可能就会认为这个任务本身就存在缺陷,不是通过重试就能有朝一日正常的。

这种时候我们可以利用tenacity中的stop_after_attempt函数,作为retry()中的stop参数传入,从而为我们“无尽”的错误重试过程添加一个终点,其中stop_after_attempt()接受一个整数输入作为「最大重试」的次数:

from tenacity import retry, stop_after_attempt

@retry(stop=stop_after_attempt(3))
def demo_func2():
    
    print('函数执行')
    
    raise Exception
    
demo_func2()

在这里插入图片描述

可以看到,我们的函数在限制了最大重试次数后,经过3次重试,在第4次继续执行依然抛出错误后,正式地抛出了函数中对应的Exception错误结束了重试过程。

2.3 设置重试最大超时时长

我们除了像上一小节中那样设置最大错误重试的次数之外,tenacity还为我们提供了stop_after_delay()函数来设置整个重试过程的最大耗时,超出这个时长也会结束重试过程:

import time
from tenacity import retry, stop_after_delay

# 设置重试最大超时时长为5秒
@retry(stop=stop_after_delay(5))
def demo_func3():
    
    time.sleep(1)
    print(f'已过去 {time.time() - start_time} 秒')
    
    raise Exception

# 记录开始时间
start_time = time.time()
demo_func3()

在这里插入图片描述

2.4 组合重试停止条件

如果我们的任务同时需要添加最大重试次数以及最大超时时长限制,在tenacity中仅需要用|运算符组合不同的限制条件再传入retry()的stop参数即可,譬如下面的例子,当我们的函数执行重试超过3秒或次数大于5次时均可以结束重试:

import time
import random
from tenacity import retry, stop_after_delay, stop_after_attempt

@retry(stop=(stop_after_delay(3) | stop_after_attempt(5)))
def demo_func4():
    
    time.sleep(random.random())
    print(f'已过去 {time.time() - start_time} 秒')
    
    raise Exception

# 记录开始时间
start_time = time.time()
demo_func4()

在这里插入图片描述

可以看到,在上面的演示中,先达到了“最大重试5次”的限制从而结束了重试过程。

2.5 设置相邻重试之间的时间间隔

有些情况下我们并不希望每一次重试抛出错误后,立即开始下一次的重试,譬如爬虫任务中为了更好地伪装我们的程序,tenacity中提供了一系列非常实用的函数,配合retry()的wait参数,帮助我们妥善处理相邻重试之间的时间间隔,其中较为实用的主要有以下两种方式:

2.5.1 设置固定时间间隔

我们通过使用tenacity中的wait_fixed()可以为相邻重试之间设置固定的等待间隔秒数,就像下面的简单示例那样:

import time
from tenacity import retry, wait_fixed, stop_after_attempt

# 设置重试等待间隔为1秒
@retry(wait=wait_fixed(1), stop=stop_after_attempt(3))
def demo_func5():
    
    print(f'已过去 {time.time() - start_time} 秒')
    
    raise Exception
    
# 记录开始时间
start_time = time.time()
demo_func5()

在这里插入图片描述

2.5.2 设置随机时间间隔

除了设置固定的时间间隔外,tenacity还可以通过wait_random()帮助我们为相邻重试设置均匀分布随机数,只需要设置好均匀分布的范围即可:

import time
from tenacity import retry, wait_random, stop_after_attempt

# 设置重试等待间隔为1到3之间的随机数
@retry(wait=wait_random(min=1, max=3), stop=stop_after_attempt(5))
def demo_func6():
    
    print(f'已过去 {time.time() - start_time} 秒')
    
    raise Exception

# 记录开始时间
start_time = time.time()
demo_func6()

在这里插入图片描述

可以观察到,每一次重试后的等待时长都是随机的~

2.6 自定义是否触发重试

tenacity中retry()的默认策略是当其所装饰的函数执行过程“抛出任何错误”时即进行重试,但有些情况下我们需要的可能是对特定错误类型的捕捉/忽略,亦或是对异常计算结果的捕捉。

tenacity中同样内置了相关的实用功能:

2.6.1 捕捉或忽略特定的错误类型

使用tenacity中的retry_if_exception_type()和retry_if_not_exception_type(),配合retry()的retry参数,我们可以对特定的错误类型进行捕捉或忽略:

from tenacity import retry, retry_if_exception_type, retry_if_not_exception_type

@retry(retry=retry_if_exception_type(FileExistsError))
def demo_func7():
    
    raise TimeoutError
    
@retry(retry=retry_if_not_exception_type(FileNotFoundError))
def demo_func8():

    raise FileNotFoundError

在这里插入图片描述

在这里插入图片描述

2.6.2 自定义函数结果条件判断函数

我们可以编写额外的条件判断函数,配合tenacity中的retry_if_result(),实现对函数的返回结果进行自定义条件判断,返回True时才会触发重试操作:

import random
from tenacity import retry, retry_if_result

@retry(retry=retry_if_result(lambda x: x >= 0.1))
def demo_func9():
    a = random.random()
    print(a)
    return a

# 记录开始时间
demo_func9()

在这里插入图片描述

2.7 对函数的错误重试情况进行统计

被tenacity的retry()装饰的函数,我们可以打印其retry.statistics属性查看其历经的错误重试统计记录结果,譬如这里我们对前面执行过的示例函数demo_func9()的统计结果进行打印:

demo_func9.retry.statistics

在这里插入图片描述

除了上述的功能之外,tenacity还具有很多特殊的特性,可以结合logging模块、异步函数、协程等其他Python功能实现更高级的功能,感兴趣的朋友可以前往https://GitHub.com/jd/tenacity了解更多。

到此这篇关于Python中最强大的错误重试库(tenacity库)的文章就介绍到这了,更多相关Python tenacity错误重试库内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Python中最强大的错误重试库(tenacity库)

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

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

猜你喜欢
  • Python中最强大的错误重试库(tenacity库)
    目录1 简介2 tenacity中的常用功能2.1 tenacity的基础使用2.2 设置最大重试次数2.3 设置重试最大超时时长2.4 组合重试停止条件2.5 设置相邻重试之间的时...
    99+
    2024-04-02
  • Python中最强大的错误重试库问题怎么解决
    本文小编为大家详细介绍“Python中最强大的错误重试库问题怎么解决”,内容详细,步骤清晰,细节处理妥当,希望这篇“Python中最强大的错误重试库问题怎么解决”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。1 简...
    99+
    2023-06-30
  • Python重试库 Tenacity详解(推荐)
    目录1 Tenacity描述2 如果发生异常就重试3 设置停止重试的条件设置重试的最大次数还可以设置stop 时间停止重试条件 进行组合4 设置重试的间隔5 重试触发的条件针对具体的...
    99+
    2024-04-02
  • Flutter最强大的图表库fl_chart的使用
    文章目录 简介简单使用折线图柱状图饼图 简介 fl_chart是Flutter中功能最全、最强大的图表库。在flutter中的地位相当于前端的echarts、android端的MPAn...
    99+
    2023-09-14
    fl_chart Flutter
  • PHP 错误处理中的最佳工具和库?
    php 中最佳的错误处理工具和库包括:内置方法:set_error_handler() 和 error_get_last()第三方工具包:whoops(调试和错误格式化)第三方服务:se...
    99+
    2024-05-09
    php 错误处理
  • Python强大的自有模块——标准库
    引言:Python的强大体现在“模块自信”上,因为Python不仅有很强大的自有模块(标准库),还有海量的第三方模块(或者包、库),并且很多开发者还在不断贡献在自己开发的新模块(或者包、库)。本文将向大家概述介绍Python的自有模块...
    99+
    2023-01-31
    模块 强大 标准
  • Python中强大的命令行库click入门教程
    前言 我们的游戏资源处理工具是Python实现的,功能包括csv解析,UI材质处理,动画资源解析、批处理,Androd&iOS自动打包等功能。该项目是由其他部门继承过来的,由于绝大部分代码不符合我们的业务需...
    99+
    2022-06-04
    命令行 入门教程 强大
  • Python的最大递归深度错误 “max
      今天在写爬虫的时候,发现了一个诡异的事情,使用str方法强制转换一个BeautifulSoup对象成字符串的时候报错了,提示是“maximum recursion depth exceeded while calling a Pytho...
    99+
    2023-01-31
    递归 深度 错误
  • Python标准库的强大功能的示例分析
    Python标准库的强大功能的示例分析,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Python标准库是十分庞大的,其中也有一些质量比较高的库,例如,wXPython、Py...
    99+
    2023-06-17
  • Python的Pywin32库:简化Windows编程的强大工具
    导言: Python是一种功能强大的编程语言,广泛用于各个领域。然而,当涉及到Windows操作系统的编程时,可能会遇到一些挑战。这时,Pywin32库就派上了用场。Pywin32是一个开源的Python扩展库,提供了访问Windows A...
    99+
    2023-09-01
    python windows 开发语言
  • Oracle 11g、12c大量错误登陆尝试带来的数据库异常
    APPLIES TO: Oracle Database - Enterprise Edition - Version 10.2.0.5 and later Information in this docum...
    99+
    2024-04-02
  • Python强大的信号库blinker入门详细教程
    目录1、信号2、blinker 使用2.1 命名信号2.2 匿名信号2.3 组播信号2.4 接收方订阅主题2.5 装饰器用法2.6 可订阅主题的装饰器2.7 检查信号是否有接收者2....
    99+
    2024-04-02
  • android中自建数据库时遇到的最最最常见的错误的解决方法!!!
    hello!大家好啊!好久不见哈,有些日子没写博客了哈!不过我可没偷懒啊,我只不过去收集博客素材了,收获满满哦!好了,简单的嘘寒问暖过后,下面进...
    99+
    2022-06-06
    方法 数据 数据库 Android
  • mysql数据库中varchar的最大长度
    1、varchar存储规则:mysql4.0版本以下,varchar(20),指的是20字节,如果存放UTF8汉字时,只能存6个(每个汉字3字节) mysql5.0版本以上,varchar...
    99+
    2024-04-02
  • Golang函数库的错误处理和调试指南
    go 函数库的错误处理和调试指南提供了以下方法:错误处理显式错误检查多返回值函数defer 和 recover错误包裹调试使用日志记录设置断点使用调试器(dlv)这些技术旨在帮助开发人员...
    99+
    2024-04-19
    调试 golang
  • python中可以发生异常自动重试库retrying
    目录1、前言2、快速开始2.1、安装retrying2.2、模拟无限重试2.3、模拟最大重试次数2.4、模拟最大重试时间2.5、模拟重试间隔时间2.6、指定重试调用的方法2.7、指定...
    99+
    2024-04-02
  • Python 中有哪些强大的数值计算库?numpy 是其中之一吗?
    Python 作为一门高级编程语言,为数据科学家和研究人员提供了一个强大的平台,用于进行数据处理、分析和可视化。Python 中有众多的数值计算库,其中最流行的是 numpy。本文将介绍 numpy,以及其他一些 Python 中的数值计...
    99+
    2023-09-26
    numy api leetcode
  • python中的单元测试和数据库测试
    登录测试被测试的代码逻辑 @app.route('/login', methods=['POST']) def login(): username = request.form.get('username') passwor...
    99+
    2023-01-31
    单元测试 数据库 测试
  • 为什么 NumPy 是自然语言处理中最重要的 Python 库?
    NumPy 是 Python 中最常用的科学计算库之一,它提供了一个强大的多维数组对象,以及一系列的函数和工具,用于处理这些数组。自然语言处理 (NLP) 是一个需要大量数据处理和分析的领域,因此 NumPy 在 NLP 中变得至关重要。在...
    99+
    2023-11-13
    npm 自然语言处理 numy
  • 压力测试数据库的陷阱:避免常见的错误
    1. 不明确定义目标: 在开始测试之前,明确定义压力测试的目标非常重要。 您是要评估数据库的性能限制还是识别特定瓶颈? 根据目标调整您的测试策略和指标。 2. 使用不真实的数据: 使用不真实的数据进行压力测试可能会导致错误的结果。 ...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作