Python重试任务模块tenacity
软硬件环境
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_delay
和stop_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)
,在min
和max
之间随机取值,每一次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的更多相关文章
- Python重试模块retrying
Python重试模块retrying 工作中经常碰到的问题就是,某个方法出现了异常,重试几次.循环重复一个方法是很常见的.比如爬虫中的获取代理,对获取失败的情况进行重试. 刚开始搜的几个博客讲的有点问 ...
- python之platform模块
python之platform模块 ^_^第三个模块从天而降喽!! 函数列表 platform.system() 获取操作系统类型,windows.linux等 platform.platform() ...
- python之OS模块详解
python之OS模块详解 ^_^,步入第二个模块世界----->OS 常见函数列表 os.sep:取代操作系统特定的路径分隔符 os.name:指示你正在使用的工作平台.比如对于Windows ...
- python之sys模块详解
python之sys模块详解 sys模块功能多,我们这里介绍一些比较实用的功能,相信你会喜欢的,和我一起走进python的模块吧! sys模块的常见函数列表 sys.argv: 实现从程序外部向程序传 ...
- 学习PYTHON之路, DAY 6 - PYTHON 基础 6 (模块)
一 安装,导入模块 安装: pip3 install 模块名称 导入: import module from module.xx.xx import xx from module.xx.xx impo ...
- linux下python调用c模块
在C调用Python模块时需要初始化Python解释器,导入模块等,但Python调用C模块却比较简单,下面还是以helloWorld.c 和 main.py 做一说明: (1)编写C代码,hel ...
- Python学习之模块进程函数详解
今天在看<Beginning Linux Programming>中的进程相关部分,讲到Linux几个进程相关的系统函数: system , exec , fork ,wait . Pyt ...
- python基础——第三方模块
python基础——第三方模块 在Python中,安装第三方模块,是通过包管理工具pip完成的. 如果你正在使用Mac或Linux,安装pip本身这个步骤就可以跳过了. 如果你正在使用Window ...
- python基础——使用模块
python基础——使用模块 Python本身就内置了很多非常有用的模块,只要安装完毕,这些模块就可以立刻使用. 我们以内建的sys模块为例,编写一个hello的模块: #!/usr/bin/env ...
- python 中time模块使用
在开始之前,首先要说明这几点: 1.在Python中,通常有这几种方式来表示时间:1)时间戳 2)格式化的时间字符串 3)元组(struct_time)共九个元素.由于Python的time模块实现主 ...
随机推荐
- 开启新时代,承接新使命,开放原子开源大赛OpenHarmony创新赛正式启航!
开放原子开源大赛OpenHarmony创新赛,正式启动啦! "OpenHarmony创新赛"是开放原子全球开源大赛下开设的创新赛道,面向企业.个人.高校师生等广大开发者,聚焦O ...
- C# 发布你的程序包到Nuget
1.新建一个.NET Standard 的类库项目 2.选择项目属性,在 package 栏目下填写我们的nuget包信息 3.选择我们的项目,点击"Pack" 打包 主要注意的是 ...
- Qt 操作注册表
一.写入注册表 #include <QSettings> //实例 QSettings //参数 1:注册表位置 //参数 2:操作 windows 注册表 QSettings::Nati ...
- Djangorestframework 记录一个报错 -- rest_framework.authentication.ToKenAuthentication
今天在使用 Djangorestframework 这个框架时,发生报错: ImportError: Could not import 'rest_framework.authentication.T ...
- 树模型-C4.5
C4.5: ID3的改进版本 首先,C4.5和ID3一样都是多叉树,重点是连续特征处理+特征选择的方式不同. ID3算法存在的不足, 在C4.5里面有了改进 有那些改进 不能处理连续特征的问题 C4. ...
- Python中两种网络编程方式:Socket和HTTP协议
本文分享自华为云社区<Python网络编程实践从Socket到HTTP协议的探索与实现>,作者:柠檬味拥抱. 在当今互联网时代,网络编程是程序员不可或缺的一项技能.Python作为一种高级 ...
- iOS的cer、p12格式证书解析监控
之前博客写过直接解析ipa包获取mobileprovision文件来监控APP是否过期来,但APP的推送证书还没有做, 大家都知道,iOS的推送证书不会放到ipa包里,只能通过直接解析p12或cer. ...
- 初识大数据技术之Hadoop
先上一张图: 看到这张图,我脑子里出现的第一个东西就是:这货太像旅行商问题了 有限的输入与有限的输出,当输入大于一定数值时,输出趋向于无法计算.... 其实要我说啊,旅行商问题其实没必要管他,因为这个 ...
- 很强!4.7k star,推荐一款Python工具,可实现自动化操作!!
1.介绍 在日常工作中,肯定会遇到一些重复性的工作,不管是点击某个按钮.写东西,打印东西,还是复制粘贴拷贝资料之类的,需要进行大量的重复操作.按键精灵大家都听说过,传统的方式,大家可以使用按键精灵将操 ...
- 使用Docker搭建MongoDB 5.0版本副本集集群
1.mongodb集群 首先我们需要了解mongodb的集群模式,mongodb安装分为单机安装和集群安装.集群安装分为:主从复制(Master-Slaver)集群.副本集(Replica Set)集 ...