Python4,它,会魔法吧,来自最强大的错误重试库。(二)

简介: Python4,它,会魔法吧,来自最强大的错误重试库。(二)

2.5 组合重试停止条件


如果同时需要添加最大重试次数以及最大超时时长限制,

在tenacity中仅需要用 | 运算符组合不同的限制条件再传入retry()的stop参数即可,


代码示例


# -*- coding:utf-8 -*-
# @Time   : 2022-04-04
# @Author : carl_DJ
import  time
import random
from tenacity import retry,stop_after_attempt,stop_after_delay
#函数执行重试超过3秒或次数大于5次时均可以结束重试
@retry(stop =(stop_after_attempt(3) | stop_after_delay(5)))
def  demo_four():
    time.sleep(random.random())
    print(f'已过去 {time.time() - start_time} 秒')
    raise Exception
#开始时间
start_time = time.time()
demo_four()


运行结果

image.png


2.6 相邻重试时间间隔


tenacity中提供了一系列非常实用的函数,配合retry()的wait参数,帮助我们妥善处理相邻重试之间的时间间隔,其中较为实用的主要有以下两种方式:


固定时间间隔;

随机时间间隔;


2.6.1 固定时间间隔


使用tenacity中的**wait_fixed()**可以为相邻重试之间设置固定的等待间隔秒数


代码示例


# -*- coding:utf-8 -*-
# @Time   : 2022-04-04
# @Author : carl_DJ
import time
from tenacity import  retry,wait_fixed,stop_after_attempt
# 设置重试等待间隔为1秒
@retry(wait = wait_fixed(1),stop = stop_after_attempt(3))
def demo_five():
    print(f'已过去 {time.time() - start_time} 秒')
    raise  Exception
#开始时间
start_time = time.time()
demo_five()


运行结果


image.png

2.6.2 随机时间间隔


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


代码示例


# -*- coding:utf-8 -*-
# @Time   : 2022-04-04
# @Author : carl_DJ
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(4))
def demo_six():
    print(f'已过去 {time.time() - start_time} 秒')
    raise  Exception
#开始时间
start_time = time.time()
demo_six()


运行结果

image.png


2.7 自定义是否触发重试


tenacity中retry()的默认策略是当其所装饰的函数执行过程“抛出任何错误”时即进行重试,

但有些情况下需要的可能是对特定错误类型的捕捉/忽略,亦或是对异常计算结果的捕捉。

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


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

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


2.7.1 忽略特定错误类型


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


代码示例


# -*- coding:utf-8 -*-
# @Time   : 2022-04-04
# @Author : carl_DJ
'''
捕捉或忽略特定的错误类型
'''
from tenacity import retry,retry_if_exception_type,retry_if_not_exception_type
#retry_if_exception_type()
@retry(retry=retry_if_exception_type(FileExistsError))
def demo_seven():
    raise TimeoutError
demo_seven()
#retry_if_not_exception_type()
@retry(retry=retry_if_not_exception_type(FileNotFoundError))
def demo_eight():
    raise FileNotFoundError
demo_eight()


运行结果


demo_seven()

image.png

demo_eight()

image.png


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


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


代码示例


# -*- coding:utf-8 -*-
# @Time   : 2022-04-04
# @Author : carl_DJ
import  random
from tenacity import  retry,retry_if_result
@retry(retry = retry_if_result(lambda x: x >= 0.1))
def demo_nine():
    a =  random.random()
    print(f'{a}')
    return a
demo_nine()


运行结果

image.png


3、总结


今天的分享,就到这里了。

是不是奇奇怪怪的姿势,又增加了呢。

在错误的重试姿势,也增加了。

关注小鱼,学习更多关于python第三方库的知识。


目录
相关文章
|
5天前
|
网络协议 数据库连接 Python
python知识点100篇系列(17)-替换requests的python库httpx
【10月更文挑战第4天】Requests 是基于 Python 开发的 HTTP 库,使用简单,功能强大。然而,随着 Python 3.6 的发布,出现了 Requests 的替代品 —— httpx。httpx 继承了 Requests 的所有特性,并增加了对异步请求的支持,支持 HTTP/1.1 和 HTTP/2,能够发送同步和异步请求,适用于 WSGI 和 ASGI 应用。安装使用 httpx 需要 Python 3.6 及以上版本,异步请求则需要 Python 3.8 及以上。httpx 提供了 Client 和 AsyncClient,分别用于优化同步和异步请求的性能。
python知识点100篇系列(17)-替换requests的python库httpx
|
14天前
|
Shell Python
Python 的 os 库的应用实例
Python 的 os 库的应用实例
17 3
|
14天前
|
Linux Python Windows
Python sys 库的应用实例
Python sys 库的应用实例
20 3
|
14天前
|
Python
Python 中的 spell checker 库
Python 中的 spell checker 库
28 1
|
16天前
|
人工智能 搜索推荐 API
使用 Python holidays 库获取中国节日
使用 Python holidays 库获取中国节日
64 2
|
6天前
|
Linux Android开发 开发者
【Python】GUI:Kivy库环境安装与示例
这篇文章介绍了 Kivy 库的安装与使用示例。Kivy 是一个开源的 Python 库,支持多平台开发,适用于多点触控应用。文章详细说明了 Kivy 的主要特点、环境安装方法,并提供了两个示例:一个简单的 Hello World 应用和一个 BMI 计算器界面。
13 0
|
11天前
|
PyTorch 测试技术 算法框架/工具
Python中Thop库的常见用法和代码示例
肆十二在B站分享了关于THOP(Torch-OpCounter)的实战教学视频。THOP是一个用于计算PyTorch模型操作数和计算量的工具,帮助开发者评估模型复杂度和性能。本文介绍了THOP的安装、使用方法及基本用例,包括如何计算模型的FLOPs和参数量。
27 0
|
11天前
|
算法 数据可视化 计算机视觉
Python中医学图像处理常用的库
在Python中,医学图像处理常用的库包括:ITK(及其简化版SimpleITK)、3D Slicer、Pydicom、Nibabel、MedPy、OpenCV、Pillow和Scikit-Image。这些库分别擅长图像分割、配准、处理DICOM和NIfTI格式文件、图像增强及基础图像处理等任务。选择合适的库需根据具体需求和项目要求。
22 0
|
11天前
|
SQL 关系型数据库 MySQL
Python中Pymysql库的常见用法和代码示例
`pymysql` 是一个用于连接 MySQL 数据库的 Python 库,支持 SQL 查询的执行和结果处理。通过 `pip install pymysql` 安装后,可使用 `connect()` 方法建立连接,`cursor()` 创建游标执行查询,包括数据的增删改查,并通过 `commit()` 和 `rollback()` 管理事务,最后需关闭游标和连接以释放资源。
28 0
|
11天前
|
计算机视觉 Python
Python中Pillow库的常见用法和代码示例
Pillow是Python中广泛使用的图像处理库,支持丰富的图像操作功能,包括但不限于打开、保存、缩放、裁剪、旋转、调色等。本文通过一系列示例介绍Pillow的基本用法,涵盖图像的加载与显示、尺寸调整、裁剪与旋转、亮度调整、格式转换、滤镜应用、图像合成及像素级操作等。首先需通过`pip install pillow`安装库,随后可通过导入`PIL.Image`等模块开始图像处理任务。无论是初学者还是进阶用户,都能从Pillow提供的强大功能中获益。
17 0