当前位置: 首页 > news >正文

工程优化- Tenacity库用于重试机制及使用示例

Tenacity 是一个用于 Python 的通用重试库,旨在简化在函数调用失败时自动重试的逻辑,提高程序的健壮性和容错能力。它特别适用于处理网络请求、数据库连接、外部 API 调用等可能因临时故障(如网络波动、服务暂时不可用)而失败的场景。

核心作用

  1. 简化重试逻辑:通过装饰器或上下文管理器,可以轻松为任何函数添加可配置的重试行为,无需编写冗长的try-except循环。
  2. 灵活的策略配置
    • 停止条件:例如限制最大重试次数(stop_after_attempt)或总重试时间(stop_after_delay)。
    • 等待策略:支持固定间隔(wait_fixed)、指数退避(wait_exponential)、随机间隔等,以控制重试之间的延迟。
    • 重试条件:可以指定仅在特定异常类型(如IOErrorConnectionError)或自定义返回值条件(如返回False时)才触发重试。
  3. 支持异步与回调:兼容异步代码(协程),并允许在重试前后执行自定义回调函数(如记录日志)。
  4. 提升代码可读性:将重试逻辑与业务逻辑分离,使代码更清晰、易于维护。

安装

pipinstalltenacity

代码示例

以下是几个典型的使用场景示例。

示例 1:基本重试(网络请求)

在请求失败时最多重试 3 次,每次间隔 2 秒。

importrequestsfromtenacityimportretry,stop_after_attempt,wait_fixed@retry(stop=stop_after_attempt(3),wait=wait_fixed(2))deffetch_data(url):response=requests.get(url)response.raise_for_status()# 非 200 状态码会抛出异常returnresponse.json()# 使用try:data=fetch_data("https://api.example.com/data")print("成功获取数据:",data)exceptExceptionase:print(f"最终失败:{e}")

说明:如果请求抛出异常(如网络错误或 HTTP 错误),函数会自动重试,最多 3 次,每次等待 2 秒。

示例 2:指数退避等待

使用指数退避策略(首次等待 1 秒,后续按倍数增加,最多等待 10 秒),最多重试 5 次。

fromtenacityimportretry,stop_after_attempt,wait_exponential@retry(stop=stop_after_attempt(5),wait=wait_exponential(multiplier=1,min=1,max=10))defcall_external_api():# 模拟外部 API 调用response=requests.get("https://external.service/api")response.raise_for_status()returnresponse.text

说明:这种策略能避免对服务端造成瞬时压力,常用于分布式系统。

示例 3:仅针对特定异常重试

只在发生Timeout异常时重试,其他异常直接抛出。

fromrequestsimportexceptionsfromtenacityimportretry,retry_if_exception_type@retry(retry=retry_if_exception_type(exceptions.Timeout))defrequest_with_timeout():print("尝试请求...")raiseexceptions.Timeout# 模拟超时request_with_timeout()

说明:通过retry_if_exception_type可以精确控制重试的异常类型。

示例 4:根据返回值条件重试

当函数返回False时重试,最多 3 次。

fromtenacityimportretry,stop_after_attempt,retry_if_resultdefis_false(value):returnvalueisFalse@retry(stop=stop_after_attempt(3),retry=retry_if_result(is_false))defcheck_status():# 模拟检查状态,返回 False 表示未就绪returnFalsecheck_status()

说明:这种方式适用于需要根据结果(而非异常)决定是否重试的场景,例如等待某个条件达成。

示例 5:组合停止条件与重试后回调

设置“最多重试 5 次或总时间不超过 10 秒”的停止条件,并在重试失败后执行回调。

fromtenacityimportretry,stop_after_attempt,stop_after_delay,retry_if_exception_typedeflog_failure(retry_state):print(f"重试失败,最后一次异常:{retry_state.outcome.exception()}")@retry(stop=(stop_after_attempt(5)|stop_after_delay(10)),retry=retry_if_exception_type(IOError),retry_error_callback=log_failure)defread_file():withopen("temp.txt","r")asf:returnf.read()

说明:这里使用|组合多个停止条件,并在最终失败时通过回调记录日志。

注意事项

  • 幂等性:确保重试的操作是幂等的(多次执行结果相同),避免因重试导致重复提交或数据不一致。
  • 资源释放:在重试循环中注意资源(如连接、文件句柄)的及时释放。
  • 超时设置:合理设置重试次数和等待时间,避免无限重试或过长延迟影响用户体验。

Tenacity 因其配置灵活、API 简洁,已成为 Python 生态中处理重试逻辑的首选库之一。通过上述示例,你可以快速将其集成到项目中,提升代码的可靠性。

http://www.jsqmd.com/news/104157/

相关文章:

  • AI如何解决PDF预览难题?快马平台一键生成解决方案
  • torch.where vs numpy.where:性能对比全解析
  • 传统VS现代:EasyPlayer开发效率提升300%的秘密
  • EmotiVoice与语音唤醒技术结合的智能家居场景设想
  • 效率翻倍:一键切换工作/娱乐分辨率方案
  • 2025年无人机探测设备制造企业权威推荐榜单:无人机反制模块/无人机侦测反制设备/无人机管制设备源头厂家精选 - 品牌推荐官
  • 1小时搞定:用await快速开发天气查询CLI工具
  • LobeChat节日营销专题页内容策划
  • 再次提醒下本周六日参加考研的人!
  • AI写论文的软件有哪些?实测11款AI论文工具,AI效率与低AI率兼得! - 掌桥科研-AI论文写作
  • 告别传统测速:AI如何将网络诊断效率提升10倍
  • 2025年沥青搅拌设备源头厂家权威推荐榜单:沥青搅拌站/温拌泡沫沥青设备/沥青混凝土搅拌站源头厂家精选 - 品牌推荐官
  • 互联网档案馆使用指南:小白也能懂的历史网页查询
  • 垃圾收集器与内存分配策略
  • GUI Agent vs 传统UI开发:效率提升300%的秘密
  • 电脑新手必看:Windows安装失败怎么办?
  • 低成本打造专属声优!EmotiVoice声音克隆实测分享
  • 2025年12月电线/防火/控制电缆厂家推荐指南:五家企业实力铸就品质之选 - 深度智识库
  • 2025年高精度大理石量具品牌推荐:大理石量具角尺靠谱厂商有 - mypinpai
  • 零基础教程:图解Linux安装Python全流程
  • UG\NX二次开发,根据对称面计算对称向量对称点的方法
  • 1小时搭建:基于Windows Server 2016的测试环境原型
  • 50、Perl函数详解:MRO、多调用、数值及兼容性函数
  • 告别重复代码:Java自定义注解效率提升300%的秘诀
  • 建筑渗漏治理的标准化实践:基于上海芮生建设14年经验与“六步法”的技术解析 - shruisheng
  • 快速验证:CentOS7换源对软件安装速度的影响
  • Python小白必看:5分钟掌握Switch Case的Python式写法
  • 企业级Maven项目部署问题实战解析
  • 用ToDesk+Ubuntu构建远程实验室原型
  • AI Agent在金融风险分析中的应用