广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Python中最强大的错误重试库问题怎么解决
  • 368
分享到

Python中最强大的错误重试库问题怎么解决

2023-06-30 10:06:41 368人浏览 八月长安

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

摘要

本文小编为大家详细介绍“python中最强大的错误重试库问题怎么解决”,内容详细,步骤清晰,细节处理妥当,希望这篇“Python中最强大的错误重试库问题怎么解决”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。1 简

本文小编为大家详细介绍“python中最强大的错误重试库问题怎么解决”,内容详细,步骤清晰,细节处理妥当,希望这篇“Python中最强大的错误重试库问题怎么解决”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

1 简介

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

2 tenacity中的常用功能

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

2.1 tenacity的基础使用

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

import randomfrom tenacity import retry@retrydef demo_func1():    a = random.random()    print(a)        if a >= 0.1:        raise Exceptiondemo_func1()

Python中最强大的错误重试库问题怎么解决

可以看到,我们的函数体内每次生成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()

Python中最强大的错误重试库问题怎么解决

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

2.3 设置重试最大超时时长

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

import timefrom 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()

Python中最强大的错误重试库问题怎么解决

2.4 组合重试停止条件

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

import timeimport randomfrom 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()

Python中最强大的错误重试库问题怎么解决

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

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

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

1 设置固定时间间隔

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

import timefrom 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()

Python中最强大的错误重试库问题怎么解决

2 设置随机时间间隔

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

import timefrom 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()

Python中最强大的错误重试库问题怎么解决

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

2.6 自定义是否触发重试

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

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

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

Python中最强大的错误重试库问题怎么解决

Python中最强大的错误重试库问题怎么解决

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

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

import randomfrom 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()

Python中最强大的错误重试库问题怎么解决

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

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

demo_func9.retry.statistics

Python中最强大的错误重试库问题怎么解决

读到这里,这篇“Python中最强大的错误重试库问题怎么解决”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网Python频道。

--结束END--

本文标题: Python中最强大的错误重试库问题怎么解决

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

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

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

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

下载Word文档
猜你喜欢
  • Python中最强大的错误重试库问题怎么解决
    本文小编为大家详细介绍“Python中最强大的错误重试库问题怎么解决”,内容详细,步骤清晰,细节处理妥当,希望这篇“Python中最强大的错误重试库问题怎么解决”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。1 简...
    99+
    2023-06-30
  • Python中最强大的错误重试库(tenacity库)
    目录1 简介2 tenacity中的常用功能2.1 tenacity的基础使用2.2 设置最大重试次数2.3 设置重试最大超时时长2.4 组合重试停止条件2.5 设置相邻重试之间的时...
    99+
    2022-11-10
  • Java中的StackOverflowError错误问题怎么解决
    这篇文章主要介绍了Java中的StackOverflowError错误问题怎么解决的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java中的StackOverflowError错误问题怎么解决文章都会有所收获,...
    99+
    2023-07-02
  • JavaScript中遇到的错误问题怎么解决
    本篇内容介绍了“JavaScript中遇到的错误问题怎么解决”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Demo演示每个按钮都会引发一个“...
    99+
    2023-06-02
  • 怎么解决MySQL中的ERROR 1045 (28000)错误问题
    本篇内容介绍了“怎么解决MySQL中的ERROR 1045 (28000)错误问题”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔...
    99+
    2022-10-19
  • 怎么解决MySQL中的ERROR 1201 (HY000)错误问题
    这篇文章主要介绍“怎么解决MySQL中的ERROR 1201 (HY000)错误问题”,在日常操作中,相信很多人在怎么解决MySQL中的ERROR 1201 (HY000)错误问题问题上存在疑惑,小编查阅了...
    99+
    2022-10-19
  • JavsScript中Promise的错误捕获问题怎么解决
    本篇内容介绍了“JavsScript中Promise的错误捕获问题怎么解决”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!我们需要在异步任务中...
    99+
    2023-07-02
  • 怎么解决Mysql tools中orztop导致的错误问题
    这篇文章主要介绍“怎么解决Mysql tools中orztop导致的错误问题”,在日常操作中,相信很多人在怎么解决Mysql tools中orztop导致的错误问题问题上存在疑惑,小编查阅了各式资料,整理出...
    99+
    2022-10-19
  • 在Go语言中如何解决并发网络请求的请求错误重试和容错处理问题?
    在Go语言中如何解决并发网络请求的请求错误重试和容错处理问题?随着互联网的高速发展,网络请求已经成为了日常开发中不可或缺的一部分。然而,网络请求并不总是成功的,可能会遇到各种错误。在并发请求中,这些错误很可能会导致整个程序的崩溃,因此我们需...
    99+
    2023-10-22
    并发:Concurrent 网络请求:HTTP request 容错处理:Fault tolerance
  • 怎么解决python路径错误,运行.py文件,找不到路径的问题
    这篇文章主要介绍“怎么解决python路径错误,运行.py文件,找不到路径的问题”,在日常操作中,相信很多人在怎么解决python路径错误,运行.py文件,找不到路径的问题问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对...
    99+
    2023-06-09
  • 怎么解决 Windows-Linux 双启动设置中显示时间错误的问题
    这篇文章主要讲解了“怎么解决 Windows-Linux 双启动设置中显示时间错误的问题”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么解决 Windows-Linux 双启动设置中显示时...
    99+
    2023-06-15
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作