python简单的retry模块
背景
我们经常遇到一个场景,就是如果操作失败则需要多次重试某些操作,这种情况下,如果想优雅的实现功能,又不关心重试逻辑,则可以学习该模块
安装
API
stop_max_attempt_number:用来设定最大的尝试次数,超过该次数就停止重试
stop_max_delay:比如设置成10000,那么从被装饰的函数开始执行的时间点开始,到函数成功运行结束或者失败报错中止的时间点,只要这段时间超过10秒,函数就不会再执行了
wait_fixed:设置在两次retrying之间的停留时间
wait_random_min和wait_random_max:用随机的方式产生两次retrying之间的停留时间
wait_exponential_multiplier和wait_exponential_max:以指数的形式产生两次retrying之间的停留时间,产生的值为2^previous_attempt_number * wait_exponential_multiplier,previous_attempt_number是前面已经retry的次数,如果产生的这个值超过了wait_exponential_max的大小,那么之后两个retrying之间的停留值都为wait_exponential_max。这个设计迎合了exponential backoff算法,可以减轻阻塞的情况。
永久运行直到成功
from retrying import retry
import time
@retry(stop_max_attempt_number=8)
def return_future_result(message):
print(message, '.........')
time.sleep(2)
raise ValueError("")
if __name__ == '__main__':
return_future_result("hello world")
出现指定异常则重试
from retrying import retry
import time
def retry_if_io_error(exception):
return isinstance(exception, FileNotFoundError)
@retry(retry_on_exception=retry_if_io_error)
def read_a_file():
print("读取文件内容")
with open("file", "r") as f:
return f.read()
if __name__ == '__main__':
read_a_file()
出现指定结果则重试
from retrying import retry
import time
def retry_if_result_none(result):
if result % 4 == 0:
print("是4的倍数,重试")
return True
else:
return False
@retry(retry_on_result=retry_if_result_none, stop_max_attempt_number=3)
def get_result(num):
print("处理{}....".format(num))
time.sleep(2)
return num
if __name__ == '__main__':
get_result(0)