python重试装饰器的简单实现
简单实现了一个在函数执行出现异常时自动重试的装饰器,支持控制最多重试次数,每次重试间隔,每次重试间隔时间递增。
最新的代码可以访问从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:装饰器的简单理解
1.装饰器的本质是函数,主要用来装饰其他函数,也就是为其他函数添加附加功能 2.装饰器的原则: (1) 装饰器不能修改被装饰的函数的源代码 (2) 装饰器不能修改被装饰的函数的调用方式 3.实现装饰器 ...
- 【转】详解Python的装饰器
原文链接:http://python.jobbole.com/86717/ Python中的装饰器是你进入Python大门的一道坎,不管你跨不跨过去它都在那里. 为什么需要装饰器 我们假设你的程序实现 ...
- 理解Python中的装饰器//这篇文章将python的装饰器来龙去脉说的很清楚,故转过来存档
转自:http://www.cnblogs.com/rollenholt/archive/2012/05/02/2479833.html 这篇文章将python的装饰器来龙去脉说的很清楚,故转过来存档 ...
- 详解Python的装饰器
Python中的装饰器是你进入Python大门的一道坎,不管你跨不跨过去它都在那里. 为什么需要装饰器 我们假设你的程序实现了say_hello()和say_goodbye()两个函数. def sa ...
- 关于python的装饰器(初解)
在python中,装饰器(decorator)是一个主要的函数,在工作中,有了装饰器简直如虎添翼,许多公司面试题也会考装饰器,而装饰器的意思又很难让人理解. python中,装饰器是一个帮函数动态增加 ...
- python之装饰器(decorator)
python的装饰器如果用得好,那是大神,用的不好最好别用... 装饰器(decorator)主要包含俩大属性: 1.不能改变原有函数的调用方式 2.不能改变原有函数的代码 第一个表示,我不需要改变原 ...
- 【转】Python之装饰器
[转]Python之装饰器 本节内容 必要知识回顾 情景模拟 装饰器的概念及实现原理 回马枪(带参数的装饰器) 一. 必要知识回顾 在开始说装饰器之前,需要大家熟悉之前说过的相关知识点: 函数即“变量 ...
- python异常装饰器--比较全的版本了
# 异常捕获装饰器(亦可用于类方法) def try_except_log(f=None, max_retries: int = 5, delay: (int, float) = 1, step: ( ...
- 【转】【Python】装饰器
1.闭包 >>> def outer(): ... x = 1 ... def inner(): ... ... return inner >>> foo = ou ...
随机推荐
- spring aop 动态代理批量调用方法实例
今天项目经理发下任务,需要测试 20 个接口,看看推送和接收数据是否正常.因为对接传输的数据是 xml 格式的字符串,所以我拿现成的数据,先生成推送过去的数据并存储到文本,以便验证数据是否正确,这时候 ...
- Android异步消息机制
Android中的异步消息机制分为四个部分:Message.Handler.MessageQueue和Looper. 其中,Message是线程之间传递的消息,其what.arg1.arg2字段可以携 ...
- 使用js做创建图片及删除图片 若有什么不对或不完整的地方,请大家提出来,谢谢
首先我们要在<body>中创建一个按钮<button>来用作点击创建图片,在<button>中写一个点击事件(随便命名), 在创建一个<div>存放图片 ...
- java 之 职责链模式(大话设计模式)
目前很多OA办公自动化软件,加快了办公效率,简化流程.相信很多小伙伴都用过.笔者了解到的大多数办公软件底层实现流程大多数采用的都是Activity或者是JBPM框架. 今天笔者要说的也是类似于流程的一 ...
- 【最短路】 ZOJ 1544 Currency Exchange 推断负圈
给出 N 种货币 M 条兑换关系 開始时全部的货币S 和有X 块钱 接下来M条关系 A B W1 W2 W3 W4 表示 A->B 所需的手续费为W2块钱 汇率为W1 B->A 所需的手 ...
- Android Root原理初探
Root Linux:Root == Windows:Adminstrator Android是Linux系统吗? 操作系统 = 系统内核 + 文件系统 Linux发行版:Linux内核 + 文件系统 ...
- C++ 虚指针、成员变量与类对象的偏移地址
先给出一段代码实现 #include <iostream> using namespace std; class animal { protected: int age; public: ...
- 关于Mac终端故障一直出现 [进程已完毕]
终端已打开就出现以下信息.无法输入不论什么的命令 Last login: Mon Aug 18 10:00:36 on ttys000 [进程已完毕] 原因:不知谁改动了 终端->偏好设置-&g ...
- vector删除元素与清除内存空洞
问题:stl中的vector容器经常造成删除假象,这对于c++程序猿来说是极其讨厌的,<effective stl>大师已经将之列为第17条,使用交换技巧来修整过剩容量. 内存空洞这个名词 ...
- Android查缺补漏--BroadcastReceiver的类型与使用
Broadcast 是一种被用于应用内和应用之间传递信息的机制.一个广播可以对应多个接受者.一个完整的广播机制,需要具有以下三个要素: 发送广播的Broadcast 接受广播的BroadcastRec ...