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


Posted in Python onJanuary 31, 2019

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

最新的代码可以访问从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 相关文章推荐
Python函数学习笔记
Oct 07 Python
Python+Selenium+PIL+Tesseract自动识别验证码进行一键登录
Sep 20 Python
Numpy数据类型转换astype,dtype的方法
Jun 09 Python
python中使用iterrows()对dataframe进行遍历的实例
Jun 09 Python
Python基于opencv调用摄像头获取个人图片的实现方法
Feb 21 Python
python实现AES和RSA加解密的方法
Mar 28 Python
详解利用Python scipy.signal.filtfilt() 实现信号滤波
Jun 05 Python
python主线程与子线程的结束顺序实例解析
Dec 17 Python
Django User 模块之 AbstractUser 扩展详解
Mar 11 Python
MxNet预训练模型到Pytorch模型的转换方式
May 25 Python
python下对hsv颜色空间进行量化操作
Jun 04 Python
Python使用Turtle模块绘制国旗的方法示例
Feb 28 Python
Python实现合并两个有序链表的方法示例
Jan 31 #Python
Django 日志配置按日期滚动的方法
Jan 31 #Python
Python类的继承用法示例
Jan 31 #Python
判断python对象是否可调用的三种方式及其区别详解
Jan 31 #Python
python3使用QQ邮箱发送邮件
May 20 #Python
Python实现FTP弱口令扫描器的方法示例
Jan 31 #Python
对python条件表达式的四种实现方法小结
Jan 30 #Python
You might like
php 实现进制相互转换
2016/04/07 PHP
php 与 nginx 的处理方式及nginx与php-fpm通信的两种方式
2018/09/28 PHP
基于PHP实现生成随机水印图片
2020/12/09 PHP
JavaScript高级程序设计 读书笔记之九 本地对象Array
2012/02/27 Javascript
js 距离某一时间点时间是多少实现代码
2013/10/14 Javascript
js获取某元素的class里面的css属性值代码
2014/01/16 Javascript
JQuery EasyUI 数字格式化处理示例
2014/05/05 Javascript
详解jquery中$.ajax方法提交表单
2014/11/03 Javascript
JavaScript面向对象的实现方法小结
2015/04/14 Javascript
jQuery实现带延迟的二级tab切换下拉列表效果
2015/09/01 Javascript
jquery延迟对象解析
2016/10/26 Javascript
AngularJS中update两次出现$promise属性无法识别的解决方法
2017/01/05 Javascript
AngularJS实现注册表单验证功能
2017/10/16 Javascript
Vue.js实现tab切换效果
2019/07/24 Javascript
如何构建 vue-ssr 项目的方法步骤
2020/08/04 Javascript
JavaScript实现京东快递单号查询
2020/11/30 Javascript
[03:04]DOTA2超级联赛专访ZSMJ “莫名其妙”的逆袭
2013/05/23 DOTA
python 截取 取出一部分的字符串方法
2017/03/01 Python
浅谈numpy中linspace的用法 (等差数列创建函数)
2017/06/07 Python
Python 3中print函数的使用方法总结
2017/08/08 Python
python爬虫headers设置后无效的解决方法
2017/10/21 Python
使用PyInstaller将python转成可执行文件exe笔记
2018/05/26 Python
python基于SMTP协议发送邮件
2019/05/31 Python
详解Python图像处理库Pillow常用使用方法
2019/09/02 Python
Python流程控制 if else实现解析
2019/09/02 Python
Python打包模块wheel的使用方法与将python包发布到PyPI的方法详解
2020/02/12 Python
python 对象真假值的实例(哪些视为False)
2020/12/11 Python
如何用Matlab和Python读取Netcdf文件
2021/02/19 Python
python和opencv构建运动检测器的实现
2021/03/03 Python
CSS3 实现弹幕的示例代码
2017/08/07 HTML / CSS
HTML5注册表单的自动聚焦与占位文本示例代码
2013/07/19 HTML / CSS
诗狄娜化妆品官方网站:Stila Cosmetics
2016/12/21 全球购物
大学学习个人的自我评价
2014/02/18 职场文书
会议室管理制度范本
2015/08/06 职场文书
健身房被搭讪?用python写了个小米计时器助人为乐
2021/06/08 Python
Redis+AOP+自定义注解实现限流
2022/06/28 Redis