适用场景
功能使用说明
tenacity 的错误重试核心功能是由其retry 装饰器来实现的 默认retry 不给参数时,将会不停地重试下去, 这也不符合需求的.
设置最大重试次数
retry(stop=stop_after_attempt(3)) 将在尝试3次后,于第4次抛出异常.
设置重试最大超时时长
retry(stop=stop_after_delay(5)) ,整个重试的超时时长超于5秒, 将停止重试.
组合重试条件
retry(stop=(stop_after_delay(5) | stop_after_attempt(3)))
将在重试总时长超过5秒后, 或者 重试3次后, 停止重试
设置相邻两次重试的时间间隔
有两种方式:
- 设置固定的时间间隔
retry(wait=wait_fixed(1), stop=stop_after_attempt(3))
重试3次, 每次重试间隔1秒
- 设置随机的时间间隔
retry(wait=wait_random(min=1, max=3), stop=stop_after_attempt(3))
重试3次, 每次重试间隔1到3秒
自定义是否触发重试
- 捕捉或忽略特定的错误类型
retry(retry=retry_if_exception_type(FileExistsError))
retry(retry=retry_if_not_exception_type(FileNotFoundError))
若是FileExistsError,则重试 若是FileNotFoundError,则不用重试.
- 自定义函数结果,使用条件判断函数
retry(retry=retry_if_result(lambda x: x>1))
若函数体的返回结果大于1, 则重试
- 对函数的错误重试情况进行统计
print(fun_name.retry.statistics)
可以打印fun_name的重试统计情况
代码
from tenacity import retry, stop_after_attempt, stop_after_delay
import random
@retry(stop=stop_after_attempt(3))
def fun_name1():
print("函数体内执行")
raise Exception
import time
@retry(stop=stop_after_delay(2))
def fun_name2():
print("函数体内执行")
time.sleep(1)
print(time.time())
raise Exception
@retry(stop=(stop_after_delay(3) | stop_after_attempt(10) ))
def fun_name3():
print("函数体内执行")
time.sleep(random.random())
print(time.time())
raise Exception
from tenacity import wait_fixed, wait_random
@retry(wait=wait_fixed(1), stop=stop_after_delay(5))
def fun_name4():
print("函数体内执行")
print(time.time())
raise Exception
@retry(wait=wait_random(min=1,max=3), stop=stop_after_delay(5))
def fun_name5():
print("函数体内执行")
print(time.time())
raise Exception
fun_name5()
fun_name4()
fun_name3()
fun_name2()
|