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中的偏函数
Apr 27 Python
Python中使用items()方法返回字典元素对的教程
May 21 Python
Python实现队列的方法
May 26 Python
python更新列表的方法
Jul 28 Python
python实现SMTP邮件发送功能
Jun 16 Python
Python教程之全局变量用法
Jun 27 Python
python中pandas.DataFrame的简单操作方法(创建、索引、增添与删除)
Mar 12 Python
python实现12306火车票查询器
Apr 20 Python
浅析Python3中的对象垃圾收集机制
Jun 06 Python
python pandas移动窗口函数rolling的用法
Feb 29 Python
python 读取二进制 显示图片案例
Apr 24 Python
利用python批量爬取百度任意类别的图片的实现方法
Oct 07 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使用simplexml_load_file加载XML文件并显示XML的方法
2015/03/19 PHP
CI框架教程之优化验证码机制详解【验证码辅助函数】
2019/04/16 PHP
Prototype Array对象 学习
2009/07/19 Javascript
jquery 图片轮换效果
2010/07/29 Javascript
原生js实现shift/ctrl/alt按键的获取
2013/04/08 Javascript
基于JavaScript自定义构造函数的详解说明
2013/04/24 Javascript
js利用事件的阻止冒泡实现点击空白模态框的隐藏
2014/01/24 Javascript
如何用jquery控制表格奇偶行及活动行颜色
2014/04/20 Javascript
javascript实现数组内值索引随机化及创建随机数组的方法
2015/08/10 Javascript
JavaScript实现点击按钮直接打印
2016/01/06 Javascript
关于Bootstrap弹出框无法调用问题的解决办法
2016/03/10 Javascript
基于bootstrap的文件上传控件bootstrap fileinput
2016/12/23 Javascript
浅谈vuex之mutation和action的基本使用
2017/08/29 Javascript
js实现HTML中Select二级联动的实例
2018/01/05 Javascript
vue3.0 CLI - 1 - npm 安装与初始化的入门教程
2018/09/14 Javascript
详解webpack 最简打包结果分析
2019/02/20 Javascript
Node.js折腾记一:读指定文件夹,输出该文件夹的文件树详解
2019/04/20 Javascript
vue 避免变量赋值后双向绑定的操作
2020/11/07 Javascript
用python实现面向对像的ASP程序实例
2014/11/10 Python
Python 3中print函数的使用方法总结
2017/08/08 Python
django admin.py 外键,反向查询的实例
2019/07/26 Python
python之生产者消费者模型实现详解
2019/07/27 Python
Python pandas.DataFrame 找出有空值的行
2019/09/09 Python
flask框架json数据的拿取和返回操作示例
2019/11/28 Python
Python用类实现扑克牌发牌的示例代码
2020/06/01 Python
python实现斗地主分牌洗牌
2020/06/22 Python
在Pytorch中使用Mask R-CNN进行实例分割操作
2020/06/24 Python
解析Python 偏函数用法全方位实现
2020/06/26 Python
Merchant 1948澳大利亚:新西兰领先的鞋类和靴子供应商
2018/03/24 全球购物
Travelstart沙特阿拉伯:廉价航班、豪华酒店和实惠的汽车租赁优惠
2019/04/06 全球购物
汉米尔顿手表官网:Hamilton
2020/09/13 全球购物
感恩教育活动总结
2014/05/05 职场文书
银行员工犯错检讨书
2014/09/16 职场文书
大学生毕业评语
2014/12/31 职场文书
PHP实现rar解压读取扩展包小结
2021/06/03 PHP
Python爬虫入门案例之爬取去哪儿旅游景点攻略以及可视化分析
2021/10/16 Python