当前位置: 首页 > 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回调函数记录重试信息。


http://www.mrgr.cn/news/31422.html

相关文章:

  • golang分布式缓存项目 Day5 分布式节点
  • mongoDB的安装及使用
  • 【Unity/GameFramework】Start Force ——配置和表加载
  • windows中docker安装redis和redisinsight记录
  • 云原生周刊:Istio 1.24.0 正式发布
  • fragment的动态调用方法
  • 【Linux庖丁解牛】—Linux基本指令(上)!
  • 数字签名和CA数字证书的核心原理
  • 最新植物大战僵尸杂交版V2.5版本【包含历史版本!持续更新!!】
  • 功耗中30分钟下载场景对平均电流标准的影响评估
  • 战神5/战神:诸神黄昏/God of War Ragnarok
  • go语言 数组和切片
  • k8s快速搭建+prometheus部署及使用(纯干货!!!)
  • 【二分搜索】二分搜索代码模板
  • 【高分系列卫星简介——高分一号(GF-1)】
  • A. Make All Equal
  • MATLAB绘图基础8:双变量图形绘制
  • ELF文件结构
  • LeetCode337. 打家劫舍III
  • 【千帆AppBuilder】零代码+组件+代码节点方式实现AI应用《法定退休年龄计算器》
  • ArrayList和Array有什么区别?
  • 算法课习题汇总(2)
  • Data Lakehouse如何使用
  • BUUCTF-MISC-隐藏的钥匙
  • 三 auto占位符
  • Vue3中el-table组件实现分页,多选以及回显