2.5 组合重试停止条件
如果同时需要添加最大重试次数以及最大超时时长限制,
在tenacity中仅需要用 | 运算符组合不同的限制条件再传入retry()的stop参数即可,
代码示例
# -*- coding:utf-8 -*- # @Time : 2022-04-04 # @Author : carl_DJ import time import random from tenacity import retry,stop_after_attempt,stop_after_delay #函数执行重试超过3秒或次数大于5次时均可以结束重试 @retry(stop =(stop_after_attempt(3) | stop_after_delay(5))) def demo_four(): time.sleep(random.random()) print(f'已过去 {time.time() - start_time} 秒') raise Exception #开始时间 start_time = time.time() demo_four()
运行结果
2.6 相邻重试时间间隔
tenacity中提供了一系列非常实用的函数,配合retry()的wait参数,帮助我们妥善处理相邻重试之间的时间间隔,其中较为实用的主要有以下两种方式:
固定时间间隔;
随机时间间隔;
2.6.1 固定时间间隔
使用tenacity中的**wait_fixed()**可以为相邻重试之间设置固定的等待间隔秒数
代码示例
# -*- coding:utf-8 -*- # @Time : 2022-04-04 # @Author : carl_DJ import time from tenacity import retry,wait_fixed,stop_after_attempt # 设置重试等待间隔为1秒 @retry(wait = wait_fixed(1),stop = stop_after_attempt(3)) def demo_five(): print(f'已过去 {time.time() - start_time} 秒') raise Exception #开始时间 start_time = time.time() demo_five()
运行结果
2.6.2 随机时间间隔
除了设置固定的时间间隔外,tenacity还可以通过**wait_random()**为相邻重试设置均匀分布随机数,只需要设置好均匀分布的范围即可:
代码示例
# -*- coding:utf-8 -*- # @Time : 2022-04-04 # @Author : carl_DJ import time from tenacity import retry,wait_random,stop_after_attempt # 设置重试等待间隔为1到3之间的随机数 @retry(wait = wait_random(min=1,max=3),stop = stop_after_attempt(4)) def demo_six(): print(f'已过去 {time.time() - start_time} 秒') raise Exception #开始时间 start_time = time.time() demo_six()
运行结果
2.7 自定义是否触发重试
tenacity中retry()的默认策略是当其所装饰的函数执行过程“抛出任何错误”时即进行重试,
但有些情况下需要的可能是对特定错误类型的捕捉/忽略,亦或是对异常计算结果的捕捉。
tenacity中同样内置了相关的实用功能:
捕捉或忽略特定的错误类型;
自定义函数结果条件判断函数;
2.7.1 忽略特定错误类型
使用tenacity中的retry_if_exception_type()和retry_if_not_exception_type(),配合retry()的retry参数,对特定的错误类型进行捕捉或忽略:
代码示例
# -*- coding:utf-8 -*- # @Time : 2022-04-04 # @Author : carl_DJ ''' 捕捉或忽略特定的错误类型 ''' from tenacity import retry,retry_if_exception_type,retry_if_not_exception_type #retry_if_exception_type() @retry(retry=retry_if_exception_type(FileExistsError)) def demo_seven(): raise TimeoutError demo_seven() #retry_if_not_exception_type() @retry(retry=retry_if_not_exception_type(FileNotFoundError)) def demo_eight(): raise FileNotFoundError demo_eight()
运行结果
demo_seven()
demo_eight()
2.7.2 自定义函数结果条件判断函数
我们可以编写额外的条件判断函数,配合tenacity中的retry_if_result(),实现对函数的返回结果进行自定义条件判断,返回True时才会触发重试操作:
代码示例
# -*- coding:utf-8 -*- # @Time : 2022-04-04 # @Author : carl_DJ import random from tenacity import retry,retry_if_result @retry(retry = retry_if_result(lambda x: x >= 0.1)) def demo_nine(): a = random.random() print(f'{a}') return a demo_nine()
运行结果
3、总结
今天的分享,就到这里了。
是不是奇奇怪怪的姿势,又增加了呢。
在错误的重试姿势,也增加了。
关注小鱼,学习更多关于python第三方库的知识。