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 17 Python
在IIS服务器上以CGI方式运行Python脚本的教程
Apr 25 Python
在Lighttpd服务器中运行Django应用的方法
Jul 22 Python
利用Python实现Windows定时关机功能
Mar 21 Python
Python基于csv模块实现读取与写入csv数据的方法
Jan 18 Python
对python中Matplotlib的坐标轴的坐标区间的设定实例讲解
May 25 Python
django rest framework 数据的查找、过滤、排序的示例
Jun 25 Python
PyQt5 实现给窗口设置背景图片的方法
Jun 13 Python
python被修饰的函数消失问题解决(基于wraps函数)
Nov 04 Python
Python partial函数原理及用法解析
Dec 11 Python
Pytoch之torchvision.transforms图像变换实例
Dec 30 Python
Python 避免字典和元组的多重嵌套问题
Jul 15 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
玩转图像函数库―常见图形操作
2006/09/03 PHP
PHP批量检测并去除文件BOM头代码实例
2014/05/08 PHP
Yii编程开发常见调用技巧集锦
2016/07/15 PHP
使用一个for循环将N*N的二维数组的所有值置1实现方法
2017/05/29 PHP
tp5(thinkPHP5)操作mongoDB数据库的方法
2018/01/20 PHP
Js中sort()方法的用法
2006/11/04 Javascript
利用WebBrowser彻底解决Web打印问题(包括后台打印)
2009/06/22 Javascript
document.getElementById为空或不是对象的解决方法
2010/01/24 Javascript
js监听输入框值的即时变化onpropertychange、oninput
2011/07/13 Javascript
js 剪切板的用法(clipboardData.setData)与js match函数介绍
2013/11/19 Javascript
javascript实现数组中的内容随机输出
2015/08/11 Javascript
json格式数据的添加,删除及排序方法
2016/01/21 Javascript
浅谈js图片前端预览之filereader和window.URL.createObjectURL
2016/06/30 Javascript
基于Bootstrap漂亮简洁的CSS3价格表(附源码下载)
2017/02/28 Javascript
bootstrap table表格使用方法详解
2017/04/26 Javascript
jQuery Ajax自定义分页组件(jquery.loehpagerv1.0)实例详解
2017/05/01 jQuery
AngularJS封装$http.post()实例详解
2017/05/06 Javascript
Node.js利用js-xlsx处理Excel文件的方法详解
2017/07/05 Javascript
js经验分享 JavaScript反调试技巧
2018/03/10 Javascript
bootstrap table合并行数据并居中对齐效果
2018/10/17 Javascript
JS实现的小火箭发射动画效果示例
2018/12/08 Javascript
移动端(微信等使用vConsole调试console的方法
2019/03/05 Javascript
koa大型web项目中使用路由装饰器的方法示例
2019/04/02 Javascript
详解JavaScript 为什么要有 Symbol 类型?
2019/04/03 Javascript
IE浏览器下JS脚本提交表单后,不能自动提示问题解决方法
2019/06/04 Javascript
javascript 使用sleep函数的常见方法详解
2020/04/26 Javascript
Python SqlAlchemy动态添加数据表字段实例解析
2018/02/07 Python
Sanic框架安装与简单入门示例
2018/07/16 Python
Python读取pdf表格写入excel的方法
2021/01/22 Python
css3 border旋转时的动画应用
2016/01/22 HTML / CSS
Html5移动端获奖无缝滚动动画实现示例
2018/06/25 HTML / CSS
香港百佳网上超级市场:PARKNSHOP.com
2020/06/10 全球购物
大学迎新晚会主持词
2014/03/24 职场文书
学法用法心得体会(2016推荐篇)
2016/01/21 职场文书
Nginx 路由转发和反向代理location配置实现
2021/11/11 Servers
索尼ICF-5900W收音机测评
2022/04/24 无线电