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

[python3] 处理函数的重试

tenacity是一个 Python 库,用于简化重试逻辑的实现。它提供了装饰器和工具函数,使得在函数执行失败时可以自动重试。以下是对tenacity库的详细介绍:

一、安装

可以使用pip安装tenacity

pip install tenacity

二、主要概念和功能

  1. 装饰器

    • @retry:这是最常用的装饰器,用于在函数执行失败时自动重试。可以通过参数配置重试的条件、次数、延迟等。
    • @retry_always:无论函数执行结果如何,始终重试。
    • @retry_if_exception_type:根据异常类型决定是否重试。例如,可以指定只在特定类型的异常发生时重试。
  2. 重试条件

    • retry(wait=...):指定重试之间的等待时间。可以使用内置的等待策略,如指数退避(wait_exponential)、固定等待时间(wait_fixed)等。
    • retry(stop=...):定义重试的停止条件。可以设置最大重试次数(stop_max_attempt_number)、最大等待时间(stop_max_delay)等。
    • retry(retry=...):自定义重试的条件函数。该函数接收一个参数,表示上一次执行的结果,如果返回True则重试,否则停止。
  3. 异常处理

    • retry_if_exception_type(...):指定在特定类型的异常发生时重试。可以传入一个或多个异常类型。
    • retry_if_not_result(...):根据函数的返回值决定是否重试。例如,可以检查返回值是否为None或满足其他条件。
  4. 回调函数

    • retry(after=...):在每次重试后执行一个回调函数。可以用于记录日志、发送通知等。
    • retry(before=...):在每次重试前执行一个回调函数。可以用于准备资源、设置状态等。

三、使用示例

  1. 基本重试:
import tenacity
import random@tenacity.retry
def some_function():result = random.randint(1, 10)if result < 5:raise Exception("Failed.")else:return resulttry:print(some_function())
except Exception as e:print(f"Final failure: {e}")

在这个例子中,some_function会在返回值小于 5 时抛出异常并自动重试,直到返回值大于等于 5。

  1. 自定义重试条件和等待时间:
import tenacity
import timedef is_failure(result):return result is False@tenacity.retry(wait=tenacity.wait_fixed(2), retry=tenacity.retry_if_result(is_failure))
def another_function():result = random.choice([True, False])print(f"Result: {result}")return resulttry:another_function()
except Exception as e:print(f"Final failure: {e}")

在这个例子中,another_function会在返回值为False时重试,每次重试之间等待 2 秒。自定义的重试条件函数is_failure根据返回值决定是否重试。

  1. 使用回调函数:
import tenacity
import loggingdef log_retry(retry_state):logging.info(f"Retrying {retry_state.fn.__name__}, attempt #{retry_state.attempt_number}")@tenacity.retry(wait=tenacity.wait_exponential(multiplier=1, min=2, max=10), after=log_retry)
def yet_another_function():result = random.randint(1, 10)if result < 5:raise Exception("Failed.")else:return resulttry:yet_another_function()
except Exception as e:print(f"Final failure: {e}")

在这个例子中,yet_another_function在失败时会按照指数退避策略重试,每次重试后会调用log_retry回调函数记录重试信息。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • node nvm 基础用法
  • 大批量查询方案简记(Mybatis流式查询)
  • 云原生信息安全:筑牢数字化时代的安全防线
  • 计算机网络 8.*结构化布线
  • 软设9.20
  • 工作流activiti笔记(六)已办列表
  • 【鸿蒙】HarmonyOS NEXT开发快速入门教程之ArkTS语法装饰器(上)
  • 固执和坚持99%的人不作区分
  • 【观点】AI时代程序员的核心竞争力:发展不可替代的关键技能
  • [嵌入式] 3588相关
  • 【C++篇】C++类与对象深度解析(六):全面剖析拷贝省略、RVO、NRVO优化策略
  • 【系统架构设计师-2013年真题】案例分析-答案及详解
  • 基于机器学习的癌症数据分析与预测系统实现,有三种算法,bootstrap前端+flask
  • 新媒体运营
  • Echats 实现CPK (过程能力)研究报告
  • 【140天】尚学堂高淇Java300集视频精华笔记(86-87)
  • es6(二):字符串的扩展
  • exports和module.exports
  • JavaScript类型识别
  • PAT A1120
  • PHP 小技巧
  • python大佬养成计划----difflib模块
  • SpringCloud(第 039 篇)链接Mysql数据库,通过JpaRepository编写数据库访问
  • 观察者模式实现非直接耦合
  • 如何合理的规划jvm性能调优
  • 使用 5W1H 写出高可读的 Git Commit Message
  • 听说你叫Java(二)–Servlet请求
  • 微信小程序实战练习(仿五洲到家微信版)
  • 微信支付JSAPI,实测!终极方案
  • 限制Java线程池运行线程以及等待线程数量的策略
  • 用 Swift 编写面向协议的视图
  • 做一名精致的JavaScripter 01:JavaScript简介
  • ​​​​​​​ubuntu16.04 fastreid训练过程
  • #[Composer学习笔记]Part1:安装composer并通过composer创建一个项目
  • #git 撤消对文件的更改
  • #include
  • (003)SlickEdit Unity的补全
  • (3)nginx 配置(nginx.conf)
  • (Java岗)秋招打卡!一本学历拿下美团、阿里、快手、米哈游offer
  • (pt可视化)利用torch的make_grid进行张量可视化
  • (Redis使用系列) SpringBoot 中对应2.0.x版本的Redis配置 一
  • (层次遍历)104. 二叉树的最大深度
  • (二)延时任务篇——通过redis的key监听,实现延迟任务实战
  • (翻译)Entity Framework技巧系列之七 - Tip 26 – 28
  • (七)理解angular中的module和injector,即依赖注入
  • (三十五)大数据实战——Superset可视化平台搭建
  • (十二)python网络爬虫(理论+实战)——实战:使用BeautfulSoup解析baidu热搜新闻数据
  • (终章)[图像识别]13.OpenCV案例 自定义训练集分类器物体检测
  • (转)Android学习笔记 --- android任务栈和启动模式
  • (自用)gtest单元测试
  • **Java有哪些悲观锁的实现_乐观锁、悲观锁、Redis分布式锁和Zookeeper分布式锁的实现以及流程原理...
  • .axf 转化 .bin文件 的方法
  • .Net FrameWork总结
  • .NET MVC第三章、三种传值方式
  • /etc/sudoers (root权限管理)