python重试装饰器的简单实现

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python重试装饰器的简单实现相关的知识,希望对你有一定的参考价值。

简单实现了一个在函数执行出现异常时自动重试的装饰器,支持控制最多重试次数,每次重试间隔,每次重试间隔时间递增。

核心代码20行不到,最新的代码可以访问从github上获取

https://github.com/blackmatrix7/matirx-tookit/blob/master/decorator/retry.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time  : 2017/8/24 20:36
# @Author  : BlackMatrix
# @Site : 
# @File : retry.py
# @Software: PyCharm
from time import sleep
from functools import wraps

__author__ = blackmatrix


"""
在函数执行出现异常时自动重试的简单装饰器
"""


def retry(max_retries=5, delay=0, step=0, sleep_func=sleep):
    """
    函数执行出现异常时自动重试的简单装饰器
    :param max_retries:  最多重试次数
    :param delay:  每次重试的延迟,单位秒
    :param step:  每次重试后延迟递增,单位秒
    :param sleep_func:  实现延迟的方法,默认为time.sleep,在一些异步框架,如
    tornado中,使用time.sleep会导致整个线程阻塞,可以传入自定义的方法来实现延迟。
    :return: 
    """
    def wrapper(func):
        @wraps(func)
        def _wrapper(*args, **kwargs):
            nonlocal delay, step, max_retries
            func_ex = None
            while max_retries > 0:
                try:
                    return func(*args, **kwargs)
                except Exception as ex:
                    func_ex = ex
                max_retries -= 1
                if delay > 0 or step > 0:
                    sleep_func(delay)
                    delay += step
            else:
                raise func_ex
        return _wrapper
    return wrapper


if __name__ == __main__:
    pass

 

以上是关于python重试装饰器的简单实现的主要内容,如果未能解决你的问题,请参考以下文章

Python @retry装饰器的使用与实现案例

Python 装饰器(装饰器的简单使用)

Python装饰器的前世今生!

python装饰器的简单理解

python 装饰器

Python小脚本基于装饰器的函数日志脚本