最强的!Python 中最强大的错误重试库!

TenacityPython的坚韧重试 是一个通用重试,用Python编写,旨在简化向任何代码添加重试逻辑的过程。它起源于已停止维护的retrying的分叉版本。利用tenacity可以大大简化程序的重试逻辑,经常被应用与网络爬虫、数据挖掘、批处理等开发任务中。 阅读详情

d3273d9a55725ede22e77bb4a23b0d2f.png

来自:凡人剧组

1 简介

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

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

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

ba76aba0dca82f23e01dff36ab95aa97.png

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()
b80a50e8808b3d9da832cfa414381d2f.png

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

可以看到,我们的函数在限制了最大重试次数后,经过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()
b71cb37dabedaeac47bcad25d7370705.png

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()
ad18471da1c9e058de236066d7719307.png

可以看到,在上面的演示中,先达到了“最大重试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()
5ae0d5c32e3f0e786032d3e351372781.png

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()
0b595083874df6bc249bb654e4e96618.png

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

2.6 自定义是否触发重试

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

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
21a1f2e25efd7743bdb0a8caa31aab62.png d830764f1379d093a694816ae4e373a7.png

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()
679ef6675033cde8fd24634b9494167f.png

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

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

demo_func9.retry.statistics
9174fbcb78577a62f976fb4ac85f02ef.png

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

本文示例代码及文件已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes

以上就是本文的全部内容,欢迎在评论区进行讨论~


这是我开发的机器人公众号小号,目前增加了天气查询,955公司名单,关注时间查询;后面还会增加图片功能和每日送书抽奖送书活动,以及调戏功能,欢迎来体验,捧场。

一个机器人公众号已经上线,欢迎调戏


 
推荐阅读:
入门: 最全的零基础学Python的问题  | 零基础学了8个月的Python  | 实战项目 |学Python就是这条捷径
干货:爬取豆瓣短评,电影《后来的我们》 | 38年NBA最佳球员分析 |   从万众期待到口碑扑街!唐探3令人失望  | 笑看新倚天屠龙记 | 灯谜答题王 |用Python做个海量小姐姐素描图 |碟中谍这么火,我用机器学习做个迷你推荐系统电影
趣味:弹球游戏  | 九宫格  | 漂亮的花 | 两百行Python《天天酷跑》游戏!
AI: 会做诗的机器人 | 给图片上色 | 预测收入 | 碟中谍这么火,我用机器学习做个迷你推荐系统电影
小工具: Pdf转Word,轻松搞定表格和水印! | 一键把html网页保存为pdf!|  再见PDF提取收费! | 用90行代码打造最强PDF转换器,word、PPT、excel、markdown、html一键转换 | 制作一款钉钉低价机票提示器! |60行代码做了一个语音壁纸切换器天天看小姐姐!|

年度爆款文案

点阅读原文,看B站我的视频!

Python最强大的错误重试 1 简介 我们在编写程序尤其是与网络请求相关的程序,如调用web接口、运行网络爬虫等任务时,经常会遇到一些偶然发生的请求失败的状况,这种时候如果我们仅仅简单的捕捉错误然后跳过对应任务,肯定是不严谨的,尤其是在网络爬虫中,会存在损失有价值数据的风险。 这类情况下我们就很有必要为我们的程序逻辑添加一些**「错误重试」**的策略,费老师我在几年前写过文章介绍过Python中的retry,但它功能较为单一,只能应对基本的需求。 而今天我要给大家介绍的tenacity,可能是目前Python生态中好用的错误重试 阅读详情

相关推荐

AI模型API测试实战:从Postman调试到Python自动化调用

API(应用程序编程接口)是现代软件系统间通信和数据交换的核心技术,其本质是一组预定义的规则和协议,允许不同应用程序或服务之间进行交互。其工作原理基于客户端-服务器模型,通过HTTP/HTTPS等标准协议发送请求并接收响应,实现功能的解耦和复用。在人工智能领域,大语言模型(LLM)API的技术价值尤为突出,它使得开发者无需训练庞大模型,即可便捷地集成先进的自然语言处理能力,显著降低了AI应用开发门槛。这类API广泛应用于智能对话系统、内容生成、代码辅助、数据分析等场景。本文以轻量级推理模型Phi-4-min

weixin_30627341的博客 370

Tenacity 高级使用指南:Python 重试机制的终极解决方案

TenacityPython 中功能强大且灵活的重试,专为处理各种失败场景设计。它提供了丰富的配置选项,包括重试次数、等待策略、重试条件等。基础用法包括简单的重试装饰器、限制重试次数、停止策略(如按次数或时间停止)、等待策略(如固定等待、随机等待、指数退避)以及重试条件(如特定异常或返回值判断)。高级功能支持回调函数、自定义回调、统计信息、异步任务以及生产级佳实践,如配置模板和断路器模式集成。佳实践建议合理设置重试次数、使用指数退避、记录日志、区分可重试异常并确保操作幂等性。通过这些功能,Ten

数据知道的博客 1万+

LangGraph图工作流:构建可验证、可重试的LLM智能体

大语言模型(LLM)作为黑箱推理引擎,常因输出不稳定、格式不可控和缺乏自我校验导致生产级失效。LangGraph通过状态驱动的有向图结构,将LLM、工具调用与条件逻辑解耦为可调度节点,实现‘执行→验证→修正’的闭环智能体范式。其核心价值在于工程可靠性:状态契约保障数据一致性,条件边支持动态路由,原生循环内置防死锁机制,配合安全工具沙盒与防御性解析,显著降低幻觉与格式错误引发的故障率。该模式已广泛应用于数学计算、工单分类、医疗摘要与IoT诊断等需高确定性的AI系统中。

ama7449的博客 306

Python实用模块(二十四)tenacity

软硬件环境windows 10 64bitsanaconda with python 3.7tenacity简介在实际应用中,经常会碰到在web请求时,因为网络的不稳定,会有请求超时的问...

3715

pythonTenacity重试的使用

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

专注于Python编程技术的分享与交流,致力于帮助开发者提升编程技能,解决实际问题,探索Python的无限可能。 1557

最强的,Python最强大的错误重试

1 简介 我们在编写程序尤其是与网络请求相关的程序,如调用web接口、运行网络爬虫等任务时,经常会遇到一些偶然发生的请求失败的状况,这种时候如果我们仅仅简单的捕捉错误然后跳过对应任务,肯定是不严谨的,尤其是在网络爬虫中,会存在损失有价值数据的风险。 这类情况下我们就很有必要为我们的程序逻辑添加一些「错误重试」的策略,费老师我在几年前写过文章介绍过Python中的retry,但它功能较为单一,只能应对基本的需求。 而今天我要给大家介绍的tenacity,可能是目前Python生态中好用的错误重试

weixin_56659172的博客 290

2025最强指南:Infinity客户端深度解析与性能优化实战

你是否还在为向量嵌入服务的高延迟而困扰?是否因客户端与服务器通信效率低下而影响整体系统性能?作为Infinity(一个高性能向量嵌入推理服务器)的官方Python客户端,`infinity_client`为开发者提供了与嵌入推理服务器高效交互的全方位解决方案。本文将带你从基础安装到高级优化,全面掌握这个强大工具的使用技巧,让你的向量嵌入应用性能提升300%。 读完本文,你将获得: - 从零开始的...

gitblog_00895的博客 402

Claude API连接失败?手把手教你解决unable to connect错误与实战配置

大型语言模型(LLM)API调用已成为现代AI应用开发的核心环节,其原理是通过HTTP请求与云端模型服务进行通信。稳定的连接是发挥技术价值的基础,直接关系到开发效率和用户体验。在实际工程实践中,开发者常因网络环境、SDK配置或密钥管理等问题,遭遇如“unable to connect to anthropic services”等连接失败报错。这些连接问题广泛存在于各类AI代理助手和本地开发环境中。本文聚焦于Anthropic Claude API,系统解析其连接机制,并提供从环境变量配置、代理设置到错误

weixin_33754065的博客 343

Python自动抢票神器,GitHub热榜第一!

点击上方“Python技术之巅”,马上关注,每天下午17:40准时推送真爱,请置顶或星标车栗子 发自凹非寺量子位 报道 | 公众号 QbitAI过几天就端午了,端午结...

欢迎关注公众号:【码农突围】,公号后台回复9999,可以获取一份500页的LeetCode刷题笔记。 1万+

Python环境配置与AI编程自动化:从单任务到批量处理实战

Python环境配置是编程自动化的基础环节,涉及虚拟环境创建、依赖管理和版本控制等核心概念。通过合理配置Python环境变量和使用虚拟环境,可以确保项目依赖隔离,避免包冲突问题。在AI编程自动化场景中,稳定的环境配置直接影响脚本执行的成功率。特别是在处理文件操作、API调用等任务时,环境一致性能够显著提升代码的可移植性和可维护性。本文基于Python 3.8+环境,详细解析从单任务测试到批量处理的完整流程,重点解决环境配置、输入输出处理和错误重试等工程实践问题,帮助开发者在实际项目中实现稳定的AI辅助编程自

weixin_33857679的博客 384

从零构建Claude CLI工具:Python命令行集成AI API实战指南

命令行接口(CLI)是开发者与操作系统交互的核心工具,通过脚本和管道组合,能高效自动化复杂工作流。其原理在于解析参数、执行命令并返回结果,技术价值在于将重复操作封装为可复用指令,极大提升效率。在AI应用场景中,将大语言模型API集成到CLI,能让开发者在终端直接调用AI能力处理文本、代码分析等任务。本文以构建Claude API命令行工具为例,详解如何使用Python和argparse实现配置管理、流式输出和文件处理等核心模块,通过环境变量安全管理API密钥,并遵循Unix哲学设计可扩展工具集,终将AI

weixin_34357928的博客 407

零代码Python自动化:n8n可视化工作流实战指南

自动化技术通过将重复性任务交由计算机自动执行,显著提升工作效率与准确性。其核心原理在于对操作流程进行抽象与封装,将复杂逻辑转化为可编排的标准化单元。在Python生态中,诸如Selenium、Requests等为自动化提供了强大基础,而可视化编排工具则进一步降低了技术门槛。这类工具通过图形化拖拽组件替代传统编码,让非开发者也能构建自动化流程,其技术价值在于实现快速原型验证与跨团队协作。典型的应用场景包括数据采集、报表生成、文件批量处理及跨系统同步等日常办公与运维任务。本文以热门的n8n平台为例,深入解析如

weixin_33698043的博客 809

Python最强大的错误重试

1 简介 我们在编写程序尤其是与网络请求相关的程序,如调用web接口、运行网络爬虫等任务时,经常会遇到一些偶然发生的请求失败的状况,这种时候如果我们仅仅简单的捕捉错误然后跳过对应任务,肯定是不严谨的,尤其是在网络爬虫中,会存在损失有价值数据的风险。 这类情况下我们就很有必要为我们的程序逻辑添加一些「错误重试」的策略,费老师我在几年前写过文章介绍过Python中的retry,但它功能较为单一,只能应对基本的需求。 而今天我要给大家介绍的tenacity,可能是目前Python生态中好用的错误重试,下面

z099164的博客 1014

解密TenacityPython最强大的重试

retry(try:在上面的示例中,定义了自定义的重试条件,仅当捕获到IOError异常时才重试重试5次。在开发Python应用程序时,处理不稳定的操作和错误是一个常见的挑战。Tenacity是一个强大重试,可以帮助你优雅地应对各种失败和异常情况。通过合理配置Tenacity的参数,可以实现灵活的重试策略,适应不同的应用场景。这篇文章介绍了Tenacity的基本用法,包括如何装饰函数以启用重试、如何配置重试的等待策略、如何处理特定的异常类型等。

bagell的博客 3472

python中的tenacity 的简单使用

1.tenacity有什么用? Tenacity是一个通用的retry,简化为任何任务加入重试的功能。 它还包含如下特性: 通用的装饰器API 可以设定重试停止的条件(比如设定尝试次数) 可以设定重试间的等待时间(比如在尝试之间使用幂数级增长的wait等待) 自定义在哪些Exception进行重试 自定义在哪些返回值的情况进行重试 协程的重试 2.为什么使用tenacity 很多时候,我们都喜欢...

qq_37287621的博客 7932

无坚不摧的Python重试机制:探索Tenacity

Tenacity是一个功能强大且易于使用的Python重试,它可以帮助开发者以一种声明式的方式处理那些可能失败的操作。通过本文的介绍,你应该已经了解了Tenacity的基本用法、安装方法、以及如何在不同场景下使用它。此外,我们还探讨了一些常见的问题及其解决方案,帮助你在使用Tenacity时更加得心应手。

AIGC搞起 1719

python-重试-tenacity

tenacity中retry()的默认策略是当其所装饰的函数执行过程“抛出任何错误”时即进行重试,但有些情况下我们需要的可能是对特定错误类型的捕捉/忽略,亦或是对异常计算结果的捕捉。tenacity我们可以编写额外的条件判断函数,配合tenacity中的,实现对函数的返回结果进行自定义条件判断,返回Truea } ,运行一次") return a if __name__ == '__main__' : # 记录开始时间 demo_func9() """a:False,运行一次a:False,运行一次。

***** 1734

Tenacity】专注于重试逻辑的python

摘要:本文介绍了Python重试tenacity的实用功能,通过代码示例展示了如何为不稳定的外部API调用添加重试逻辑。内容包括:1)基础无限重试用法;2)设置终止条件(次数/时长);3)配置三种间隔策略(固定/随机/指数);4)精细化异常捕获规则;5)原始异常抛出控制;6)重试过程日志记录。该能显著提升程序健壮性,适用于网络请求等易失败场景。作者为前百度/滴滴自动驾驶测试开发工程师,更多技术文章可见个人博客tyyuan110.com。

paperplaneY的博客 1218
上一篇: 太实用了!Schedule模块, Python 周期任务神器!
下一篇: MATLAB即将跌出TOP 20,TIOBE 4月编程语言排行榜出炉
菜鸟学Python
博客等级 码龄9年 7559粉丝 · 571原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值