软硬件环境

  • windows 11 64bits

  • python 3.6

  • tenacity

简介

在实际应用中,经常会碰到在web请求时,因为网络的不稳定,会有请求超时的问题,这时候,一般都是自己去实现重试请求的逻辑,直到得到响应或者超时。虽然这样的逻辑并不复杂,但是代码写起来却不那么优雅,不那么pythonic

tenacity是一个重试库,使用python语言编写,它能够让我们在任务的重试操作中变得非常简单,使用的是Apache 2.0开源协议。

tenacity有如下特性

  • 装饰器API

  • 可指定停止条件

  • 可指定等待条件

  • 自定义异常时的重试

  • 自定义特定返回值的重试

  • 在协程中使用

模块安装

使用pip安装tenacity

pip install tenacity

示例代码

无条件重试

这是tenacity最基本的用法,在task方法中使用装饰器@retry,当task出现异常时,我们就重新运行task,这里没加任何限制,如果异常一直出现,task就会一直运行下去

from tenacity import retry
import time
@retry
def task():
print("task running ... ")
time.sleep(1)
raise Exception
task()

执行上述代码,得到

task running ... 
task running ... 
task running ... 
task running ... 
task running ... 
task running ... 
task running ... 
task running ... 
task running ... 
task running ... 
task running ... 
task running ... 
task running ...
.
.
.

设定停止条件

通过方法stop_after_attempt指定重试的次数,如下的3次

import time
from tenacity import retry, stop_after_attempt
@retry(stop=stop_after_attempt(3))
def task():
print("task running ... ")
time.sleep(1)
raise Exception
task()

重试三次之后就报错了

或者使用方法stop_after_delay指定重试多长时候后停止,如下的3秒

from tenacity import retry, stop_after_delay
@retry(stop=stop_after_delay(3))
def task():
print("task running ... ")
raise Exception
task()

一直重试很多次,3秒后还没成功,就结束重试

还可以将stop_after_delaystop_after_attempt组合起来用,如下的代码,只要其中一个条件满足,task就停止运行

import time
from tenacity import retry, stop_after_attempt, stop_after_delay
@retry(stop=(stop_after_delay(10) | stop_after_attempt(5)))
def task():
print("task running ... ")
time.sleep(1)
raise Exception
task()

设定等待时间

使用方法wait_fixed来指定重试时等待的时间,如下代码中的3秒,每一次重试task前都要等待3秒钟

from tenacity import retry, wait_fixed
@retry(wait=wait_fixed(3))
def task():
print("task running ... ")
raise Exception
task()

如下,可以看到,每隔3秒重试一次

使用方法wait_random(min, max),在minmax之间随机取值,每一次task重试前就等待这个随机值,单位是秒

from tenacity import retry, wait_random
@retry(wait=wait_random(min=1, max=3))
def task():
print("task running ... ")
raise Exception
task()

时间有1 2 3s的

当然,上面2中种方法也是可以结合起来用的

from tenacity import retry, wait_fixed, wait_random
@retry(wait=wait_fixed(3) + wait_random(0, 2))
def task():
print("task running ... ")
raise Exception
task()

什么情况下重试

可以通过retry_if_exception_type指定特定类型的异常出现时,任务才重试

from tenacity import retry, retry_if_exception_type
@retry(retry=retry_if_exception_type(IOError))
def task():
print("task running ... ")
raise Exception
task()

重试错误后的异常抛出

出现异常后,会进行重试,若重试后还是失败,默认情况下,往上抛出的异常会变成RetryError,而不是最根本的原因。因此可以加一个参数reraise=True,使得当重试失败后,往外抛出的异常还是原来的那个异常。

from tenacity import retry, stop_after_attempt
@retry(stop=stop_after_attempt(3), reraise=True)
def task():
print("task running ... ")
raise Exception
task()

默认是false,false是重试错误

在重试前执行动作

tenacity可以在任务重试前后执行某些动作,这里以加日志为例

from tenacity import retry, stop_after_attempt, before_log
import logging
import sys
logging.basicConfig(stream=sys.stderr, level=logging.DEBUG)
logger = logging.getLogger(__name__)
@retry(stop=stop_after_attempt(3), before=before_log(logger=logger, log_level=logging.DEBUG))
def task():
print("task running ... ")
raise Exception
task()

tenacity重试后的操作类似,如下

from tenacity import retry, stop_after_attempt, after_log
import logging
import sys
logging.basicConfig(stream=sys.stderr, level=logging.DEBUG)
logger = logging.getLogger(__name__)
@retry(stop=stop_after_attempt(3), after=after_log(logger=logger, log_level=logging.DEBUG))
def task():
print("task running ... ")
raise Exception
task()

tenacity

Python实用模块专题

更多有用的python模块,请移步

https://xugaoxiang.com/category/python/modules/

参考资料

  • https://github.com/jd/tenacity

http://www.taodudu.cc/news/show-4122770.html?action=onClick

Python重试任务模块tenacity的更多相关文章

  1. Python重试模块retrying

    Python重试模块retrying 工作中经常碰到的问题就是,某个方法出现了异常,重试几次.循环重复一个方法是很常见的.比如爬虫中的获取代理,对获取失败的情况进行重试. 刚开始搜的几个博客讲的有点问 ...

  2. python之platform模块

    python之platform模块 ^_^第三个模块从天而降喽!! 函数列表 platform.system() 获取操作系统类型,windows.linux等 platform.platform() ...

  3. python之OS模块详解

    python之OS模块详解 ^_^,步入第二个模块世界----->OS 常见函数列表 os.sep:取代操作系统特定的路径分隔符 os.name:指示你正在使用的工作平台.比如对于Windows ...

  4. python之sys模块详解

    python之sys模块详解 sys模块功能多,我们这里介绍一些比较实用的功能,相信你会喜欢的,和我一起走进python的模块吧! sys模块的常见函数列表 sys.argv: 实现从程序外部向程序传 ...

  5. 学习PYTHON之路, DAY 6 - PYTHON 基础 6 (模块)

    一 安装,导入模块 安装: pip3 install 模块名称 导入: import module from module.xx.xx import xx from module.xx.xx impo ...

  6. linux下python调用c模块

    在C调用Python模块时需要初始化Python解释器,导入模块等,但Python调用C模块却比较简单,下面还是以helloWorld.c 和 main.py 做一说明:   (1)编写C代码,hel ...

  7. Python学习之模块进程函数详解

    今天在看<Beginning Linux Programming>中的进程相关部分,讲到Linux几个进程相关的系统函数: system , exec , fork ,wait . Pyt ...

  8. python基础——第三方模块

    python基础——第三方模块 在Python中,安装第三方模块,是通过包管理工具pip完成的.  如果你正在使用Mac或Linux,安装pip本身这个步骤就可以跳过了.  如果你正在使用Window ...

  9. python基础——使用模块

    python基础——使用模块 Python本身就内置了很多非常有用的模块,只要安装完毕,这些模块就可以立刻使用. 我们以内建的sys模块为例,编写一个hello的模块: #!/usr/bin/env ...

  10. python 中time模块使用

    在开始之前,首先要说明这几点: 1.在Python中,通常有这几种方式来表示时间:1)时间戳 2)格式化的时间字符串 3)元组(struct_time)共九个元素.由于Python的time模块实现主 ...

随机推荐

  1. JDK 14的新特性:文本块Text Blocks

    目录 举个例子 Indentation编排 Escaping转义 formatted格式化 总结 说起来,Text Blocks是在JDK13中以第一次预览版本引入的.现在在JDK14中是第二次预览版 ...

  2. 重磅官宣,OpenHarmony开发者大会来了!

     开放原子开源基金会OpenHarmony开发者大会2023将于4月19日在北京召开. 春风送暖万物新,OpenHarmony正当时.诚邀您参加本届大会,聆听行业大咖分享操作系统和开源的最新前沿研究成 ...

  3. win7系统部署django项目

        win7系统部署django项目,在Windows电脑上我使用的是  Apache + mod_wsgi 来部署的   # 背景 Python 3.8.3 Django 3.1.7 Apach ...

  4. 二、Unity调用Xcode封装方法

    1.开始封装Unity调用接口 我们在Xcode中 写的接口需要在extern "C"中(加上extern "C"后,会指示编译器这部分代码按C语言的进行编译) ...

  5. Stage模型深入解读

     原文链接:https://mp.weixin.qq.com/s/4Mb5BMw1IgKvqE0Ff9Ts-w,点击链接查看更多技术内容:   HarmonyOS 3.1版本(API 9)推出了全新应 ...

  6. Maven 必备技能:MAC 系统下 JDK和Maven 安装及环境变量配置详细讲解

    开发中难免因系统问题或者版本变更反复折腾JDK和Maven环境变量,干脆写个笔记备忘个,也方便小伙伴们节省时间. =================JDK安装与环境变量配置====== 1.官网下载j ...

  7. TeamViewer 9发布-在Linux下安装运行

    TeamViewer 9发布-在Linux下安装运行 来源:Linux中国  作者:未知 关注我们:    这篇指南介绍了怎么样在 RedHat. CentOS. Fedora 和 Debian. U ...

  8. C内存操作API的实现原理

    我们在编写C代码时,会使用两种类型的内存,一种是栈内存,另外一种是堆内存,其中栈内存的申请和释放是由编译器来隐式管理的,我们也称为自动内存,这种变量是最简单而且最常用的,然后就是堆内存,堆的申请和释放 ...

  9. 一些奇奇怪怪的js知识

    0.关于前端为什么typeof null 得到的结果是 object 对于 null 来说,很多人会认为他是个对象类型,其实这是错误的. 虽然 `typeof null` 会输出 `object`,但 ...

  10. 使用ollama + AnythingLLM快速且简单的在本地部署llm3

    使用ollama + AnythingLLM快速且简单的在本地部署llm3 不多说,直接开始 一.安装ollama ollama官网:https://ollama.com/ 下载地址:https:// ...