南强小屋 Design By 杰米
简单实现了一个在函数执行出现异常时自动重试的装饰器,支持控制最多重试次数,每次重试间隔,每次重试间隔时间递增。
最新的代码可以访问从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://www.cnblogs.com/blackmatrix/ # @File : retry.py # @Software: PyCharm import time from 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 wrapper if __name__ == '__main__': pass
以上这篇python重试装饰器的简单实现方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
标签:
python,重试装饰器
南强小屋 Design By 杰米
广告合作:本站广告合作请联系QQ:858582 申请时备注:广告合作(否则不回)
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
南强小屋 Design By 杰米
暂无python重试装饰器的简单实现方法的评论...
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。