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中List.count()方法的使用教程
May 20 Python
Django中URLconf和include()的协同工作方法
Jul 20 Python
Python实现模拟登录及表单提交的方法
Jul 25 Python
尝试使用Python多线程抓取代理服务器IP地址的示例
Nov 09 Python
python实现微信远程控制电脑
Feb 22 Python
用python3教你任意Html主内容提取功能
Nov 05 Python
Python学习笔记之For循环用法详解
Aug 14 Python
python实现简单颜色识别程序
Feb 19 Python
Pycharm安装并配置jupyter notebook的实现
May 18 Python
python一些性能分析的技巧
Aug 30 Python
python调用ffmpeg命令行工具便捷操作视频示例实现过程
Nov 01 Python
Python几种酷炫的进度条的方式
Apr 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
分页显示Oracle数据库记录的类之二
2006/10/09 PHP
聊天室php&mysql(五)
2006/10/09 PHP
php mysql 判断update之后是否更新了的方法
2012/01/10 PHP
PHP中使用SimpleXML检查XML文件结构实例
2015/01/07 PHP
php文件操作相关类实例
2015/06/18 PHP
Javascript中获取出错代码所在文件及行数的代码
2010/09/23 Javascript
js调用后台servlet方法实例
2013/06/09 Javascript
JS 获取select(多选下拉)中所选值的示例代码
2013/08/02 Javascript
简单的Jquery遮罩层代码实例
2013/11/14 Javascript
详谈jQuery操纵DOM元素属性 attr()和removeAtrr()方法
2015/01/22 Javascript
jquery解析json格式数据的方法(对象、字符串)
2015/11/24 Javascript
浅析AngularJs HTTP响应拦截器
2015/12/28 Javascript
jQuery实现获取table表格第一列值的方法
2016/03/01 Javascript
jquery结合html实现中英文页面切换
2016/11/29 Javascript
Vue中引入样式文件的方法
2017/08/18 Javascript
vue移动端使用canvas签名的实现
2020/01/15 Javascript
JavaScript实现下拉列表
2021/01/20 Javascript
python中mechanize库的简单使用示例
2014/01/10 Python
Python中json格式数据的编码与解码方法详解
2016/07/01 Python
Python实现合并两个列表的方法分析
2018/05/28 Python
使用Python机器学习降低静态日志噪声
2018/09/29 Python
python实现word文档批量转成自定义格式的excel文档的思路及实例代码
2020/02/21 Python
canvas绘制图片drawImage使用方法
2020/09/15 HTML / CSS
程序员经常用到的UNIX命令
2015/04/13 面试题
一道Delphi上机题
2012/06/04 面试题
校园安全广播稿
2014/02/08 职场文书
优秀大学生求职自荐信范文
2014/04/19 职场文书
学习保证书范文
2014/04/30 职场文书
最新优秀教师个人先进事迹材料
2014/05/06 职场文书
高中教师考核方案
2014/05/18 职场文书
大学生万能检讨书范例
2014/10/04 职场文书
2015年招聘工作总结
2014/12/12 职场文书
先进学校事迹材料
2014/12/30 职场文书
Django利用AJAX技术实现博文实时搜索
2021/05/06 Python
Vue CLI中模式与环境变量的深入详解
2021/05/30 Vue.js
动视暴雪取消疫苗禁令 让所有员工返回线下工作
2022/04/03 其他游戏