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 相关文章推荐
Web服务器框架 Tornado简介
Jul 16 Python
Python os模块中的isfile()和isdir()函数均返回false问题解决方法
Feb 04 Python
python通过colorama模块在控制台输出彩色文字的方法
Mar 19 Python
Python面向对象类继承和组合实例分析
May 28 Python
Python Pandas 箱线图的实现
Jul 23 Python
Python中 CSV格式清洗与转换的实例代码
Aug 29 Python
python numpy存取文件的方式
Apr 01 Python
Django框架ORM数据库操作实例详解
Nov 07 Python
Python性能分析工具py-spy原理用法解析
Jul 27 Python
记一次django内存异常排查及解决方法
Aug 07 Python
python request 模块详细介绍
Nov 10 Python
python基于tkinter制作下班倒计时工具
Apr 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
一个简单的MySQL数据浏览器
2006/10/09 PHP
使用PHP接收POST数据,解析json数据
2013/06/28 PHP
php通过递归方式复制目录和子目录的方法
2015/03/13 PHP
php判断文件上传图片格式的实例详解
2017/09/30 PHP
Yii Framework框架使用PHPExcel组件的方法示例
2019/07/24 PHP
Apply an AutoFormat to an Excel Spreadsheet
2007/06/12 Javascript
从JavaScript 到 JQuery (1)学习小结
2009/02/12 Javascript
Javascript动态绑定事件的简单实现代码
2010/12/25 Javascript
禁用JavaScript控制台调试的方法
2014/03/07 Javascript
javaScript的函数对象的声明详解
2015/02/06 Javascript
JavaScript将数字转换成大写中文的方法
2015/03/23 Javascript
jQuery实现图片上传和裁剪插件Croppie
2015/11/29 Javascript
基于javascript实现简单计算器功能
2016/01/03 Javascript
基于JavaScript实现TAB标签效果
2016/01/12 Javascript
深入理解jquery中extend的实现
2016/12/22 Javascript
JS中from 表单序列化提交的代码
2017/01/20 Javascript
nodejs Assert中equal(),strictEqual(),deepEqual(),strictDeepEqual()比较
2017/09/18 NodeJs
Vue之Vue.set动态新增对象属性方法
2018/02/23 Javascript
微信小程序中实现手指缩放图片的示例代码
2018/03/13 Javascript
vue.js实现的绑定class操作示例
2018/07/06 Javascript
基于vue和react的spa进行按需加载的实现方法
2018/09/29 Javascript
小程序实现上传视频功能
2020/08/18 Javascript
使用python实现接口的方法
2017/07/07 Python
python实现从pdf文件中提取文本,并自动翻译的方法
2018/11/28 Python
Python骚操作之动态定义函数
2019/03/26 Python
python使用正则来处理各种匹配问题
2019/12/22 Python
python实现录音功能(可随时停止录音)
2020/10/26 Python
华丽的手绘陶瓷:MacKenzie-Childs
2017/02/04 全球购物
如何用JQuery进行表单验证
2013/05/29 面试题
毕业生个人的求职信范文
2013/12/03 职场文书
教师新年寄语
2014/04/03 职场文书
安全生产标语
2014/06/06 职场文书
2015年国际护士节演讲稿
2015/03/18 职场文书
文艺节目主持词
2015/07/06 职场文书
2016入党积极分子考察评语
2015/12/01 职场文书
postgresql无序uuid性能测试及对数据库的影响
2021/06/11 PostgreSQL