时间:2021-05-22
简单实现了一个在函数执行出现异常时自动重试的装饰器,支持控制最多重试次数,每次重试间隔,每次重试间隔时间递增。
最新的代码可以访问从github上获取
https://github.com/blackmatrix7/matrix-toolkit/blob/master/toolkit/retry.py
#!/usr/bin/env python# -*- coding: utf-8 -*-# @Time : 2017/8/18 上午9:50# @Author : Matrix# @Github : https://github.com/blackmatrix7/# @Blog : http:///blackmatrix/# @File : retry.py# @Software: PyCharmimport timefrom functools import wraps__author__ = 'blackmatrix'"""在函数执行出现异常时自动重试的简单装饰器"""class StopRetry(Exception): def __repr__(self): return 'retry stop'def retry(max_retries: int =5, delay: (int, float) =0, step: (int, float) =0, exceptions: (BaseException, tuple, list) =BaseException, sleep=time.sleep, callback=None, validate=None): """ 函数执行出现异常时自动重试的简单装饰器。 :param max_retries: 最多重试次数。 :param delay: 每次重试的延迟,单位秒。 :param step: 每次重试后延迟递增,单位秒。 :param exceptions: 触发重试的异常类型,单个异常直接传入异常类型,多个异常以tuple或list传入。 :param sleep: 实现延迟的方法,默认为time.sleep。 在一些异步框架,如tornado中,使用time.sleep会导致阻塞,可以传入自定义的方法来实现延迟。 自定义方法函数签名应与time.sleep相同,接收一个参数,为延迟执行的时间。 :param callback: 回调函数,函数签名应接收一个参数,每次出现异常时,会将异常对象传入。 可用于记录异常日志,中断重试等。 如回调函数正常执行,并返回True,则表示告知重试装饰器异常已经处理,重试装饰器终止重试,并且不会抛出任何异常。 如回调函数正常执行,没有返回值或返回除True以外的结果,则继续重试。 如回调函数抛出异常,则终止重试,并将回调函数的异常抛出。 :param validate: 验证函数,用于验证执行结果,并确认是否继续重试。 函数签名应接收一个参数,每次被装饰的函数完成且未抛出任何异常时,调用验证函数,将执行的结果传入。 如验证函数正常执行,且返回False,则继续重试,即使被装饰的函数完成且未抛出任何异常。 如回调函数正常执行,没有返回值或返回除False以外的结果,则终止重试,并将函数执行结果返回。 如验证函数抛出异常,且异常属于被重试装饰器捕获的类型,则继续重试。 如验证函数抛出异常,且异常不属于被重试装饰器捕获的类型,则将验证函数的异常抛出。 :return: 被装饰函数的执行结果。 """ def wrapper(func): @wraps(func) def _wrapper(*args, **kwargs): nonlocal delay, step, max_retries func_ex = StopRetry while max_retries > 0: try: result = func(*args, **kwargs) # 验证函数返回False时,表示告知装饰器验证不通过,继续重试 if callable(validate) and validate(result) is False: continue else: return result except exceptions as ex: # 回调函数返回True时,表示告知装饰器异常已经处理,终止重试 if callable(callback) and callback(ex) is True: return func_ex = ex finally: max_retries -= 1 if delay > 0 or step > 0: sleep(delay) delay += step else: raise func_ex return _wrapper return wrapperif __name__ == '__main__': pass以上这篇python重试装饰器的简单实现方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
学设计模式中有个装饰模式,用java实现起来不是很难,但是远远没有python简单,难怪越来越火了!这里就简单讨论下python的几种装饰模式:一无参装饰器:#
需要理解的一些概念要理解Python中的装饰器,我觉得还是应该从最基本的概念开始:装饰器模式:所谓的装饰器模式,可以简单地理解为“在不改变原有内部实现的情况下,
本文实例讲述了python装饰器常见使用方法。分享给大家供大家参考,具体如下:python的装饰器,可以用来实现,类似springAOP类似的功能。一样可以用来
本文总结分析了Python装饰器简单用法。分享给大家供大家参考,具体如下:装饰器在python中扮演着很重要的作用,例如插入日志等,装饰器可以为添加额外的功能同
有时候我们要去别的接口取数据,可能因为网络原因偶尔失败,为了能自动重试,写了这么一个装饰器。这个是python2.7x的版本,python3.x可以用nonlo