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 相关文章推荐
Python3基础之输入和输出实例分析
Aug 18 Python
python中Flask框架简单入门实例
Mar 21 Python
连接Python程序与MySQL的教程
Apr 29 Python
Python解析json之ValueError: Expecting property name enclosed in double quotes: line 1 column 2(char 1)
Jul 06 Python
Python 3.6 性能测试框架Locust安装及使用方法(详解)
Oct 11 Python
Pipenv一键搭建python虚拟环境的方法
May 22 Python
Python爬虫基础之XPath语法与lxml库的用法详解
Sep 13 Python
python得到windows自启动列表的方法
Oct 14 Python
使用selenium模拟登录解决滑块验证问题的实现
May 10 Python
ubuntu 18.04搭建python环境(pycharm+anaconda)
Jun 14 Python
django 模型中的计算字段实例
May 19 Python
在 Python 中使用 7zip 备份文件的操作
Dec 11 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/11/23 PHP
PHP在线生成二维码(google api)的实现代码详解
2013/06/04 PHP
WordPress中注册菜单与调用菜单的方法详解
2015/12/18 PHP
小议Javascript中的this指针
2010/03/18 Javascript
Javascript中自动切换焦点实现代码
2012/12/15 Javascript
js 关键词高亮(根据ID/tag高亮关键字)案例介绍
2013/01/21 Javascript
JS实现局部选择打印和局部不选择打印
2014/04/03 Javascript
jQuery弹层插件jquery.fancybox.js用法实例
2016/01/22 Javascript
快速解决js中window.location.href不工作的问题
2016/11/02 Javascript
jQuery解析返回的xml和json方法详解
2017/01/05 Javascript
详解webpack解惑:require的五种用法
2017/06/09 Javascript
Bootstrap Table快速完美搭建后台管理系统
2017/09/20 Javascript
LayUI动态设置checkbox不显示的解决方法
2019/09/02 Javascript
Vue项目打包压缩的实现(让页面更快响应)
2020/03/10 Javascript
js实现自定义右键菜单
2020/05/18 Javascript
闭包在python中的应用之translate和maketrans用法详解
2014/08/27 Python
使用Python构建Hopfield网络的教程
2015/04/14 Python
pycharm安装图文教程
2017/05/02 Python
使用Python获取网段IP个数以及地址清单的方法
2018/11/01 Python
python argparser的具体使用
2019/11/10 Python
Python tkinter布局与按钮间距设置方式
2020/03/04 Python
Python unittest装饰器实现原理及代码
2020/09/08 Python
如何基于pandas读取csv后合并两个股票
2020/09/25 Python
结合CSS3的布局新特征谈谈常见布局方法
2016/01/22 HTML / CSS
施华洛世奇澳大利亚官网:SWAROVSKI澳大利亚
2017/01/06 全球购物
美国知名的家庭连锁百货商店:Boscov’s
2017/07/27 全球购物
澳大利亚时尚前卫设计师珠宝在线:Amber Sceats
2017/10/04 全球购物
威盛公司软件C++工程师笔试题面试题
2012/07/16 面试题
科室工作的个人自我评价
2013/10/30 职场文书
高中班长自我鉴定
2013/12/20 职场文书
车贷收入证明范本
2014/09/14 职场文书
运动会开幕词
2015/01/28 职场文书
城南旧事观后感
2015/06/11 职场文书
旅游投诉信范文
2015/07/02 职场文书
2019下半年英语教师的教学工作计划(3篇)
2019/09/25 职场文书
人物搭配车车超萌联名预备中 【咒术迴战】 ⨯ 【天竺鼠车车】 展开合作
2022/04/11 日漫