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的Django框架部署的一些建议
Apr 09 Python
python实现ping的方法
Jul 06 Python
Python实现1-9数组形成的结果为100的所有运算式的示例
Nov 03 Python
python实现微信自动回复功能
Apr 11 Python
Python2.7环境Flask框架安装简明教程【已测试】
Jul 13 Python
使用python验证代理ip是否可用的实现方法
Jul 25 Python
Laravel+Dingo/Api 自定义响应的实现
Feb 17 Python
python网络应用开发知识点浅析
May 28 Python
利用 Flask 动态展示 Pyecharts 图表数据方法小结
Sep 04 Python
python 图像判断,清晰度(明暗),彩色与黑白实例
Jun 04 Python
解决python和pycharm安装gmpy2 出现ERROR的问题
Aug 28 Python
python Timer 类使用介绍
Dec 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类
2006/07/15 PHP
php简单封装了一些常用JS操作
2007/02/25 PHP
php使用number_format函数截取小数的方法分析
2016/05/27 PHP
PHP单例模式详解及实例代码
2016/12/21 PHP
php中curl和soap方式请求服务超时问题的解决
2018/06/11 PHP
使用Javascript和DOM Interfaces来处理HTML
2006/10/09 Javascript
用正则获取指定路径文件的名称
2007/02/27 Javascript
AJAX分页的代码(后台asp.net)
2011/02/14 Javascript
jQuery实现点击文本框弹出热门标签的提示效果
2013/11/17 Javascript
jQuery链式操作实例分析
2015/11/16 Javascript
js判断空对象的实例(超简单)
2016/07/26 Javascript
微信小程序开发之相册选择和拍照详解及实例代码
2017/02/22 Javascript
AngularJS之自定义服务详解(factory、service、provider)
2017/04/14 Javascript
vue2.0 自定义日期时间过滤器
2017/06/07 Javascript
使用JavaScript实现链表的数据结构的代码
2017/08/02 Javascript
微信小程序 rich-text的使用方法
2017/08/04 Javascript
WebStorm ES6 语法支持设置&babel使用及自动编译(详解)
2017/09/08 Javascript
基于iScroll实现内容滚动效果
2018/03/21 Javascript
微信小程序websocket实现聊天功能
2020/03/30 Javascript
Vue组件内部实现一个双向数据绑定的实例代码
2019/04/04 Javascript
js简单的分页器插件代码实例
2019/09/11 Javascript
解决vue使用vant轮播组件swipe + flex时文字抖动问题
2021/01/07 Vue.js
[36:09]Secret vs VG 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.24
2019/09/10 DOTA
python批量实现Word文件转换为PDF文件
2018/03/15 Python
Django 中使用流响应处理视频的方法
2018/07/20 Python
python爬取内容存入Excel实例
2019/02/20 Python
用python打印菱形的实操方法和代码
2019/06/25 Python
英国领先的运动物理治疗供应公司:Vivomed
2018/07/14 全球购物
Java语言程序设计测试题选择题部分
2014/04/03 面试题
合伙经营协议书
2014/04/18 职场文书
2014年端午节演讲稿范文
2014/05/23 职场文书
计算机网络专业求职信
2014/06/05 职场文书
我们的节日国庆活动方案
2014/08/19 职场文书
中秋客户感谢信
2015/01/22 职场文书
音乐会主持人开场白
2015/05/28 职场文书
nginx之queue的具体使用
2022/06/28 Servers