在日常的工作中,可能由于网络波动原因,导致请求失败,下载超时,又或者是IO阻塞,导致不能及时响应。这时候就需要对功能添加重试代码,这里介绍一个python的第三方库:tenacity。

安装方法:

pip3 install tenacity

官方详细文档:https://pypi.org/project/retry/

示例:

1.  最简单的重试(无限重试)

from tenacity import retry@retry
def test_retry():print("重试无间隔执行...")raise Exceptiontest_retry()

装饰器@retry的常用参数说明:

@retry(wait=wait_fixed(3),  # 等待3秒后重试stop=stop_after_attempt(3),  # 只重试3次stop=stop_after_delay(3),  # 重试3秒后不再重试retry=retry_if_exception_type(exceptions_object),  # 捕获到指定异常后才重试retry=retry_if_result(func),  # 满足自定义条件时,进行重试,func为函数名,返回true时重试reraise=True,  # 重试后抛出原来的错误retry_error_callback=callback_func  # 最后一次重试失败,则调用回调函数    )

2. 等待3s后进行重试

from tenacity import retry, wait_fixed@retry(wait=wait_fixed(3))
def test_retry():print("等待重试...")raise Exceptiontest_retry()

3.  设置重试停止的条件

3.1 只重试3次就停止重试

from tenacity import retry, stop_after_attempt@retry(stop=stop_after_attempt(3))
def test_retry():print("等待重试...")raise Exceptiontest_retry()

3.2 重试3秒后不再重试

from tenacity import retry, stop_after_delay@retry(stop=stop_after_delay(3))
def test_retry():print("等待重试...")raise Exceptiontest_retry()

3.3 满足3.1或3.2其中一个条件时,不再重试

from tenacity import retry, stop_after_delay, stop_after_attempt@retry(stop=(stop_after_delay(3) | stop_after_attempt(3)))
def test_retry():print("等待重试...")raise Exceptiontest_retry()

4. 满足条件时,进行重试。

4.1 捕获到指定的异常时,进行重试

from requests import exceptions
from tenacity import retry, retry_if_exception_type@retry(retry=retry_if_exception_type(exceptions.Timeout))
def test_retry():print("等待重试...")raise exceptions.Timeouttest_retry()

4.2 满足自定义的条件时,进行重试。当is_false函数返回true,则进行重试,参数value为函数test_retry的返回值。

from tenacity import retry, stop_after_attempt, retry_if_resultdef is_false(value):return value is False@retry(stop=stop_after_attempt(3),retry=retry_if_result(is_false))
def test_retry():return Falsetest_retry()

5. 重试后抛出准确的异常

最后一次重试抛出的异常是RetryError,不会是代码逻辑真正发生的异常,想要抛出真正的异常,则设置reraise=True

from tenacity import retry, stop_after_attempt@retry(stop=stop_after_attempt(7), reraise=True)
def test_retry():print("等待重试...")raise Exceptiontest_retry()

6. 最后一个重试失败后调用回调函数。

from tenacity import *def return_last_value(retry_state):print("执行回调函数")return retry_state.outcome.result()  # 表示返回原函数的返回值def is_false(value):return value is False@retry(stop=stop_after_attempt(3),retry_error_callback=return_last_value,retry=retry_if_result(is_false))
def test_retry():print("等待重试中...")return Falseprint(test_retry())

参考:https://zhuanlan.zhihu.com/p/281555097

Python重试机制模块:tenacity相关推荐

  1. Python重试库Retrying和Tenacity

    文章目录 简介 安装 Retrying 初试 最大重试次数 最大重试时间 重试间隔 随机间隔 指数级重试间隔 自定义异常重试 自定义返回重试 参数 Tenacity 初试 最大重试次数 最大重试时间 ...

  2. 在 python中每个模块用什么来实现_Python代码模块热更新机制实现(reload)

    对一个游戏来说,无论是client或server都非常需要一套代码热更新的机制.它能大大提高开发效率,又能超乎玩家期望地在运营期在线修正bug和增添功能.可谓必备机制. 热更新机制的目标是: (1)更 ...

  3. python导入机制及importlib模块

    文章目录 写在篇前 import 关键字 先导概念 namespace & scope Module & Packages module packages regular packag ...

  4. 「信号机制」Python信号处理—signal模块

    转载请注明出处:https://blog.csdn.net/jinixin/article/details/80383177 本文是信号机制三篇记录中的第二篇,介绍Python语言中负责信号处理的si ...

  5. python 模块 导入机制 模块搜索 Python包 发布python模块或程序

    python 模块 python模块:以.py结尾的代码文件.        顶层文件: 程序执行入口        模块文件1        模块文件2        模块文件3 在python中一 ...

  6. python中怎样使用re模块_[转]Python中RE模块的应用

    Python 自1.5版本起增加了re 模块,它提供 Perl 风格的正则表达式模式.Python 1.5之前版本则是通过 regex 模块提供 Emecs 风格的模式.Emacs 风格模式可读性稍差 ...

  7. python异常机制

    python异常处理机制 1.1python的内置异常 当我们在运行代码的时候一旦程序报错,就会终止运行,并且有的异常是不可避免的,但是我们可以对异常进行捕获,防止程序终止. python的内置异常是 ...

  8. Python multiprocess 多进程模块

    转发:http://www.langzi.fun/Python multiprocess 多进程模块.html 需要注意的是,如果使用多线程,用法一定要加上if __name__=='__main__ ...

  9. python中导入模块用什么命令_Python导入模块的技巧

    作为使用Python的开发者,我们一开始学习的内容之一就是如何导入Python的各种模块或库.但是我们注意到,那些经常使用Python的用户并不一定都知道Python的导入机制其实非常灵活.在本文中, ...

  10. 一文读懂熔断器和重试机制

    导语:随着微服务的流行,熔断作为其中一项很重要的技术也广为人知.当微服务的运行质量低于某个临界值时,启动熔断机制,暂停微服务调用一段时间,以保障后端的微服务不会因为持续过负荷而宕机.本文作者介绍了熔断 ...

最新文章

  1. HJ107 二分法求求解立方根
  2. 一条简单的 SQL 执行超过1000ms,纳尼?
  3. 检索数据_1_从表中查询所有行和列
  4. 【个人感悟】效率,天道酬勤
  5. bean覆盖 springboot_SpringBoot中如何进行Bean配置
  6. .NET MAUI 预览版 6 发布
  7. 安装服务时出现The system cannot execute the specified program
  8. Patchwork Quilting(拼布和绗缝)
  9. 分形之科赫(Koch)雪花
  10. 最新亲测可用的免费google翻译api
  11. 桥接模式与路由模式有什么不同
  12. linux共享文件夹显示不出来,vmtools设置共享文件夹在linux的mnt/hgfs下却看不到文件夹的问题...
  13. 【Android】MyTool工具界面:秒表
  14. 从零基础入门Linux系统
  15. c语言 交互式电子白板案例,交互式电子白板教学案例——电子白板让修改习作不再难...
  16. 识别车牌是什么神经网络,车牌识别深度神经网络
  17. 【OCM第18期开班】第18期11g OCM培训将于8月23日,晚20点在腾讯课堂开班,第1场考试免费培训!!!...
  18. 插值、拟合和逼近的对比
  19. 【Tensorflow】mnist_with_summaries.py报错
  20. JAVA相关编译知识

热门文章

  1. 千机智能孙海锋:期待与国际同行在高端制造领域同台竞技(自主可控CAM软件:UltraCAM)
  2. 【Unity3D--自由观察模型】模型自动旋转+触屏旋转和缩放
  3. win10装win7进入不了bios的解决方法
  4. 异常:The JSP specification requires that an attribute name is preceded by whitespace
  5. android金钱符号变形,使用¥(一个中文字宽)还是¥(半个中文字宽)?
  6. python3d动画效果_使用Matplotlib 3D实现三维波浪动画
  7. Vue项目引入移动端组件库--Mand Mobile
  8. TNS-12547和TNS-12555错误解决
  9. 如何修改mc基岩版服务器端口,我的世界基岩版服务器指令设置家
  10. 网络安全工程师,念念不忘,必有回响