之前重试一直使用的是retry或retrying,最近写一个异步项目,发现这两个库都不支持异步,于是找到这个库
Tenacity 是一个 Apache 2.0 许可的通用重试库,用 Python 编写,用于简化向几乎任何事物添加重试行为的任务。
Tenacity 文档:https://tenacity.readthedocs.io/en/latest/
它具有如下特性:
- 通用装饰器 API
- 指定停止条件(即尝试次数限制)
- 指定等待条件(即尝试之间的指数退避睡眠)
- 自定义重试异常
- 自定义对预期返回结果的重试
- 重试协程
- 使用上下文管理器重试代码块
安装 Tenacity
pip install tenacity
基本使用
默认无限重试
from tenacity import retry, stop_after_attempt, stop_after_delay, wait_fixed, wait_chain
# 默认无限重试
@retry
def never_give_up_never_surrender():
print("无条件重试,重试之间无间隔,报错之后就立马重试")
raise Exception
指定重试次数
from tenacity import retry, stop_after_delay, stop_after_attempt, stop_any
# 重试7次后停止
@retry(stop=stop_after_attempt(7))
def my_function():
raise Exception
# 在 30 秒之后停止重试
@retry(stop=stop_after_delay(30))
def my_function():
# 函数体
# 在重试7次后或30 秒之后或停止重试
@retry(stop=stop_any(stop_after_attempt(7), stop_after_delay(30)))
def my_function():
# 函数体
# 在重试7次后或30 秒之后或停止重试
@retry(stop=(stop_after_attempt(7) | stop_after_delay(30)))
def my_function():
# 函数体
指定重试之间等待时间
from tenacity import retry, wait_fixed, wait_random, wait_exponential, stop_after_attempt
# 在重试之间等待 1 秒钟:
@retry(stop=stop_after_attempt(3), wait=wait_fixed(1))
def my_function():
# 函数体
# 在重试之间等待随机1-3秒钟:
@retry(stop=stop_after_attempt(3), wait=wait_random(1, 3))
def my_function():
# 函数体
# 在每次重试之间等待指数级增长的时间间隔:重试间隔将为 multiplier ** n,其中 n 是重试次数, 直到最大等待时间为 60 秒
@retry(stop=stop_after_attempt(3), wait=wait_exponential(multiplier=1, max_wait=60))
def my_function():
# 函数体
指定的异常类型
from tenacity import retry, stop_after_attempt, wait_fixed, retry_if_exception_type, retry_if_result, retry_if_not_exception_type, retry_if_not_result
# 在出现 IOError 或 OSError 异常时重试:
@retry(stop=stop_after_attempt(3), wait=wait_fixed(1), retry=retry_if_exception_type((IOError, OSError)))
def my_function():
# 函数体
# 对函数的返回结果进行自定义条件判断,返回True时才会触发重试操作
@retry(stop=stop_after_attempt(3), wait=wait_fixed(1), retry=retry_if_result(lambda x: x >= 0.1))
def demo_func9():
a = random.random()
return a
查看原文:Python重试模块tenacity
关注公众号 "字节航海家" 及时获取最新内容