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多进程编程技术实例分析
Sep 16 Python
python处理html转义字符的方法详解
Jul 01 Python
深入理解NumPy简明教程---数组1
Dec 17 Python
python 调用win32pai 操作cmd的方法
May 28 Python
10 分钟快速入门 Python3的教程
Jan 29 Python
Python for循环与range函数的使用详解
Mar 23 Python
Python后台开发Django会话控制的实现
Apr 15 Python
python实现宿舍管理系统
Nov 22 Python
Python本地及虚拟解释器配置过程解析
Oct 13 Python
python statsmodel的使用
Dec 21 Python
解决pytorch 保存模型遇到的问题
Mar 03 Python
Python爬取某拍短视频
Jun 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
MYSQL环境变量设置方法
2007/01/15 PHP
php中利用str_pad函数生成数字递增形式的产品编号
2013/09/30 PHP
ThinkPHP表单自动验证实例
2014/10/13 PHP
可以支持多中格式的JS键盘
2007/05/02 Javascript
jquery.validate分组验证代码
2011/03/17 Javascript
基于JQuery 滑动与动画的说明介绍
2013/04/18 Javascript
深入document.write()与HTML4.01的非成对标签的详解
2013/05/08 Javascript
jquery默认校验规则整理
2014/03/24 Javascript
关于JS数组追加数组采用push.apply的问题
2014/06/09 Javascript
JS的location.href跳出框架打开新页面的方法
2014/09/04 Javascript
一个JavaScript函数把URL参数解析成Json对象
2014/09/24 Javascript
JS实现自动固定顶部的悬浮菜单栏效果
2015/09/16 Javascript
浅析Bootstrap缩略图组件与警示框组件
2016/04/29 Javascript
详解在Node.js中发起HTTP请求的5种方法
2019/01/10 Javascript
实例分析编写vue组件方法
2019/02/12 Javascript
JavaScript常用工具函数大全
2020/05/06 Javascript
微信小程序之高德地图多点路线规划过程示例详解
2021/01/18 Javascript
Handtrack.js库实现实时监测手部运动(推荐)
2021/02/08 Javascript
python在不同层级目录import模块的方法
2016/01/31 Python
深入理解python中的闭包和装饰器
2016/06/12 Python
对python添加模块路径的三种方法总结
2018/10/16 Python
用Python逐行分析文件方法
2019/01/28 Python
Windows下PyCharm2018.3.2 安装教程(图文详解)
2019/10/24 Python
简单了解python filter、map、reduce的区别
2020/01/14 Python
中外合拍动画首获奥斯卡提名,“上海出品”《飞奔去月球》能否拿下最终大奖?
2021/03/16 国漫
3D动画《斗罗大陆》上线当日播放过亿
2021/03/16 国漫
与C++相比,Java中的数组有什么不同
2014/03/25 面试题
企业行政文员岗位职责
2013/12/03 职场文书
食品行业求职人的自我评价
2014/01/19 职场文书
幼儿园师德演讲稿
2014/05/06 职场文书
员工合理化建议书
2014/05/19 职场文书
委托书怎么写
2014/07/31 职场文书
2016年感恩教师节活动总结
2016/04/01 职场文书
python opencv旋转图片的使用方法
2021/06/04 Python
OpenCV-Python实现轮廓的特征值
2021/06/09 Python
Python采集爬取京东商品信息和评论并存入MySQL
2022/04/12 Python