python重试装饰器的简单实现方法

 更新时间:2019年01月31日 09:37:47   作者:BlackMatrix  
今天小编就为大家分享一篇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 中创建 PostgreSQL 数据库连接池

    Python 中创建 PostgreSQL 数据库连接池

    这篇文章主要介绍了Python 中创建 PostgreSQL 数据库连接池,Python 连接 PostgreSQL 是主要有两个包, py-postgresql 和 psycopg2 , 而本文的实例将使用后者,感兴趣的小伙伴可以参考一下
    2021-10-10
  • Python获取运行目录与当前脚本目录的方法

    Python获取运行目录与当前脚本目录的方法

    这篇文章主要介绍了Python获取运行目录与当前脚本目录的方法,涉及Python目录操作与系统相关变量的获取技巧,需要的朋友可以参考下
    2015-06-06
  • Python7个爬虫小案例详解(附源码)上篇

    Python7个爬虫小案例详解(附源码)上篇

    这篇文章主要介绍了Python7个爬虫小案例详解(附源码)上篇,本文章内容详细,通过案例可以更好的理解爬虫的相关知识,七个例子分为了三部分,本次为上篇,共有二道题,需要的朋友可以参考下
    2023-01-01
  • django 外键model的互相读取方法

    django 外键model的互相读取方法

    今天小编就为大家分享一篇django 外键model的互相读取方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-12-12
  • Python+OpenCV 实现简单的高斯滤波(推荐)

    Python+OpenCV 实现简单的高斯滤波(推荐)

    这篇文章主要介绍了Python+OpenCV 实现简单的高斯滤波,在文中需要注意的是,这里我没有特判当sigma = 0的时候的情况,具体实现过程跟随小编一起看看吧
    2021-09-09
  • opencv改变imshow窗口大小,窗口位置的方法

    opencv改变imshow窗口大小,窗口位置的方法

    下面小编就为大家分享一篇opencv改变imshow窗口大小,窗口位置的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-04-04
  • Python实现绘制多种激活函数曲线详解

    Python实现绘制多种激活函数曲线详解

    所谓激活函数(Activation Function),就是在人工神经网络的神经元上运行的函数,负责将神经元的输入映射到输出端。这篇文章主要介绍了Python如何实现绘制多种激活函数曲线,希望对大家有所帮助
    2023-04-04
  • NumPy迭代数组的实现

    NumPy迭代数组的实现

    本文主要介绍了NumPy迭代数组的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-02-02
  • python openpyxl打开文件关闭问题

    python openpyxl打开文件关闭问题

    这篇文章主要介绍了python openpyxl打开文件关闭问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-05-05
  • python的dict,set,list,tuple应用详解

    python的dict,set,list,tuple应用详解

    这篇文章主要介绍了python的dict,set,list,tuple应用详解,需要的朋友可以参考下
    2014-07-07

最新评论