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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏
· Manus爆火,是硬核还是营销?