python简单的retry模块

背景

我们经常遇到一个场景,就是如果操作失败则需要多次重试某些操作,这种情况下,如果想优雅的实现功能,又不关心重试逻辑,则可以学习该模块

安装

  • pip install 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算法,可以减轻阻塞的情况。

永久运行直到成功

#!/usr/bin/env python
# -*- coding:utf-8 -*-
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")

出现指定异常则重试

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# example1.py
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()

出现指定结果则重试

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# example1.py
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)

results matching ""

    No results matching ""