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之入门(五)缩进和选择
May 27 Python
wxPython使用系统剪切板的方法
Jun 16 Python
Python向MySQL批量插数据的实例讲解
Mar 31 Python
Python3实现的Mysql数据库操作封装类
Jun 06 Python
django如何连接已存在数据的数据库
Aug 14 Python
python numpy数组的索引和切片的操作方法
Oct 20 Python
Python实现 版本号对比功能的实例代码
Apr 18 Python
Python实现字典按key或者value进行排序操作示例【sorted】
May 03 Python
Python配置虚拟环境图文步骤
May 20 Python
python实现合并多个list及合并多个django QuerySet的方法示例
Jun 11 Python
matplotlib quiver箭图绘制案例
Apr 17 Python
只需要这一行代码就能让python计算速度提高十倍
May 24 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文章采集URL补全函数(FormatUrl)
2012/08/02 PHP
PHP is_subclass_of函数的一个BUG和解决方法
2014/06/01 PHP
Yii2实现上下联动下拉框功能的方法
2016/08/10 PHP
微信公众平台开发(五) 天气预报功能开发
2016/12/03 PHP
php关联数组与索引数组及其显示方法
2018/03/12 PHP
PHP模版引擎原理、定义与用法实例
2019/03/29 PHP
laravel-admin的多级联动方法
2019/09/30 PHP
文字幻灯片
2006/06/26 Javascript
JavaScript While 循环基础教程
2007/04/05 Javascript
分享Javascript中最常用的55个经典小技巧
2013/11/29 Javascript
javascript的创建多行字符串的7种方法
2014/04/29 Javascript
js控制网页前进和后退的方法
2015/06/08 Javascript
require.js的用法详解
2015/10/20 Javascript
js如何改变文章的字体大小
2016/01/08 Javascript
JS获取鼠标相对位置的方法
2016/09/20 Javascript
ajax实现加载页面、删除、查看详细信息 bootstrap美化页面!
2017/03/14 Javascript
Ajax高级笔记 JavaScript高级程序设计笔记
2017/06/22 Javascript
vue.js实现的绑定class操作示例
2018/07/06 Javascript
JS实现动态添加外部js、css到head标签的方法
2019/06/05 Javascript
json解析大全 双引号、键值对不在一起的情况
2019/12/06 Javascript
jQuery开发仿QQ版音乐播放器
2020/07/10 jQuery
Python3中的真除和Floor除法用法分析
2016/03/16 Python
python正则实现计算器功能
2017/12/14 Python
python获取代码运行时间的实例代码
2018/06/11 Python
python之super的使用小结
2018/08/13 Python
在python中使用with打开多个文件的方法
2019/01/07 Python
HTML5 Notification(桌面提醒)功能使用实例
2014/03/17 HTML / CSS
大学生的四年学习自我评价
2013/12/13 职场文书
管道维修工岗位职责
2013/12/27 职场文书
网上签名寄语活动留言
2014/01/18 职场文书
家长给小学生的评语
2014/01/30 职场文书
《海底世界》教学反思
2014/04/16 职场文书
党员先锋岗事迹材料
2014/05/08 职场文书
公务员学习习总书记“三严三实”思想汇报
2014/09/19 职场文书
群众路线剖析材料(四风问题)
2014/10/08 职场文书
2014年药房工作总结
2014/11/22 职场文书