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

最新的代码可以访问从github上获取

https://github.com/blackmatrix7/matrix-toolkit/blob/master/toolkit/retry.py

  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. # @Time : 2017/8/18 上午9:50
  4. # @Author : Matrix
  5. # @Github : https://github.com/blackmatrix7/
  6. # @Blog : http://www.cnblogs.com/blackmatrix/
  7. # @File : retry.py
  8. # @Software: PyCharm
  9. import time
  10. from functools import wraps
  11.  
  12. __author__ = 'blackmatrix'
  13.  
  14. """
  15. 在函数执行出现异常时自动重试的简单装饰器
  16. """
  17.  
  18. class StopRetry(Exception):
  19.  
  20. def __repr__(self):
  21. return 'retry stop'
  22.  
  23. def retry(max_retries: int =5, delay: (int, float) =0, step: (int, float) =0,
  24. exceptions: (BaseException, tuple, list) =BaseException,
  25. sleep=time.sleep, callback=None, validate=None):
  26. """
  27. 函数执行出现异常时自动重试的简单装饰器。
  28. :param max_retries: 最多重试次数。
  29. :param delay: 每次重试的延迟,单位秒。
  30. :param step: 每次重试后延迟递增,单位秒。
  31. :param exceptions: 触发重试的异常类型,单个异常直接传入异常类型,多个异常以tuple或list传入。
  32. :param sleep: 实现延迟的方法,默认为time.sleep。
  33. 在一些异步框架,如tornado中,使用time.sleep会导致阻塞,可以传入自定义的方法来实现延迟。
  34. 自定义方法函数签名应与time.sleep相同,接收一个参数,为延迟执行的时间。
  35. :param callback: 回调函数,函数签名应接收一个参数,每次出现异常时,会将异常对象传入。
  36. 可用于记录异常日志,中断重试等。
  37. 如回调函数正常执行,并返回True,则表示告知重试装饰器异常已经处理,重试装饰器终止重试,并且不会抛出任何异常。
  38. 如回调函数正常执行,没有返回值或返回除True以外的结果,则继续重试。
  39. 如回调函数抛出异常,则终止重试,并将回调函数的异常抛出。
  40. :param validate: 验证函数,用于验证执行结果,并确认是否继续重试。
  41. 函数签名应接收一个参数,每次被装饰的函数完成且未抛出任何异常时,调用验证函数,将执行的结果传入。
  42. 如验证函数正常执行,且返回False,则继续重试,即使被装饰的函数完成且未抛出任何异常。
  43. 如回调函数正常执行,没有返回值或返回除False以外的结果,则终止重试,并将函数执行结果返回。
  44. 如验证函数抛出异常,且异常属于被重试装饰器捕获的类型,则继续重试。
  45. 如验证函数抛出异常,且异常不属于被重试装饰器捕获的类型,则将验证函数的异常抛出。
  46. :return: 被装饰函数的执行结果。
  47. """
  48. def wrapper(func):
  49. @wraps(func)
  50. def _wrapper(*args, **kwargs):
  51. nonlocal delay, step, max_retries
  52. func_ex = StopRetry
  53. while max_retries > 0:
  54. try:
  55. result = func(*args, **kwargs)
  56. # 验证函数返回False时,表示告知装饰器验证不通过,继续重试
  57. if callable(validate) and validate(result) is False:
  58. continue
  59. else:
  60. return result
  61. except exceptions as ex:
  62. # 回调函数返回True时,表示告知装饰器异常已经处理,终止重试
  63. if callable(callback) and callback(ex) is True:
  64. return
  65. func_ex = ex
  66. finally:
  67. max_retries -= 1
  68. if delay > 0 or step > 0:
  69. sleep(delay)
  70. delay += step
  71. else:
  72. raise func_ex
  73. return _wrapper
  74. return wrapper
  75.  
  76. if __name__ == '__main__':
  77. pass

python重试装饰器的简单实现的更多相关文章

  1. Python:装饰器的简单理解

    1.装饰器的本质是函数,主要用来装饰其他函数,也就是为其他函数添加附加功能 2.装饰器的原则: (1) 装饰器不能修改被装饰的函数的源代码 (2) 装饰器不能修改被装饰的函数的调用方式 3.实现装饰器 ...

  2. 【转】详解Python的装饰器

    原文链接:http://python.jobbole.com/86717/ Python中的装饰器是你进入Python大门的一道坎,不管你跨不跨过去它都在那里. 为什么需要装饰器 我们假设你的程序实现 ...

  3. 理解Python中的装饰器//这篇文章将python的装饰器来龙去脉说的很清楚,故转过来存档

    转自:http://www.cnblogs.com/rollenholt/archive/2012/05/02/2479833.html 这篇文章将python的装饰器来龙去脉说的很清楚,故转过来存档 ...

  4. 详解Python的装饰器

    Python中的装饰器是你进入Python大门的一道坎,不管你跨不跨过去它都在那里. 为什么需要装饰器 我们假设你的程序实现了say_hello()和say_goodbye()两个函数. def sa ...

  5. 关于python的装饰器(初解)

    在python中,装饰器(decorator)是一个主要的函数,在工作中,有了装饰器简直如虎添翼,许多公司面试题也会考装饰器,而装饰器的意思又很难让人理解. python中,装饰器是一个帮函数动态增加 ...

  6. python之装饰器(decorator)

    python的装饰器如果用得好,那是大神,用的不好最好别用... 装饰器(decorator)主要包含俩大属性: 1.不能改变原有函数的调用方式 2.不能改变原有函数的代码 第一个表示,我不需要改变原 ...

  7. 【转】Python之装饰器

    [转]Python之装饰器 本节内容 必要知识回顾 情景模拟 装饰器的概念及实现原理 回马枪(带参数的装饰器) 一. 必要知识回顾 在开始说装饰器之前,需要大家熟悉之前说过的相关知识点: 函数即“变量 ...

  8. python异常装饰器--比较全的版本了

    # 异常捕获装饰器(亦可用于类方法) def try_except_log(f=None, max_retries: int = 5, delay: (int, float) = 1, step: ( ...

  9. 【转】【Python】装饰器

    1.闭包 >>> def outer(): ... x = 1 ... def inner(): ... ... return inner >>> foo = ou ...

随机推荐

  1. spring aop 动态代理批量调用方法实例

    今天项目经理发下任务,需要测试 20 个接口,看看推送和接收数据是否正常.因为对接传输的数据是 xml 格式的字符串,所以我拿现成的数据,先生成推送过去的数据并存储到文本,以便验证数据是否正确,这时候 ...

  2. Android异步消息机制

    Android中的异步消息机制分为四个部分:Message.Handler.MessageQueue和Looper. 其中,Message是线程之间传递的消息,其what.arg1.arg2字段可以携 ...

  3. 使用js做创建图片及删除图片 若有什么不对或不完整的地方,请大家提出来,谢谢

    首先我们要在<body>中创建一个按钮<button>来用作点击创建图片,在<button>中写一个点击事件(随便命名), 在创建一个<div>存放图片 ...

  4. java 之 职责链模式(大话设计模式)

    目前很多OA办公自动化软件,加快了办公效率,简化流程.相信很多小伙伴都用过.笔者了解到的大多数办公软件底层实现流程大多数采用的都是Activity或者是JBPM框架. 今天笔者要说的也是类似于流程的一 ...

  5. 【最短路】 ZOJ 1544 Currency Exchange 推断负圈

    给出 N 种货币 M 条兑换关系 開始时全部的货币S 和有X 块钱 接下来M条关系 A B W1 W2 W3 W4 表示 A->B 所需的手续费为W2块钱  汇率为W1 B->A 所需的手 ...

  6. Android Root原理初探

    Root Linux:Root == Windows:Adminstrator Android是Linux系统吗? 操作系统 = 系统内核 + 文件系统 Linux发行版:Linux内核 + 文件系统 ...

  7. C++ 虚指针、成员变量与类对象的偏移地址

    先给出一段代码实现 #include <iostream> using namespace std; class animal { protected: int age; public: ...

  8. 关于Mac终端故障一直出现 [进程已完毕]

    终端已打开就出现以下信息.无法输入不论什么的命令 Last login: Mon Aug 18 10:00:36 on ttys000 [进程已完毕] 原因:不知谁改动了 终端->偏好设置-&g ...

  9. vector删除元素与清除内存空洞

    问题:stl中的vector容器经常造成删除假象,这对于c++程序猿来说是极其讨厌的,<effective stl>大师已经将之列为第17条,使用交换技巧来修整过剩容量. 内存空洞这个名词 ...

  10. Android查缺补漏--BroadcastReceiver的类型与使用

    Broadcast 是一种被用于应用内和应用之间传递信息的机制.一个广播可以对应多个接受者.一个完整的广播机制,需要具有以下三个要素: 发送广播的Broadcast 接受广播的BroadcastRec ...