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自定义函数的创建、调用和函数的参数详解
Mar 11 Python
朴素贝叶斯算法的python实现方法
Nov 18 Python
在Python的Django框架中加载模版的方法
Jul 16 Python
如何优雅地改进Django中的模板碎片缓存详解
Jul 04 Python
selenium3+python3环境搭建教程图解
Dec 07 Python
python实现微信每日一句自动发送给喜欢的人
Apr 29 Python
Python可迭代对象操作示例
May 07 Python
Python pandas实现excel工作表合并功能详解
Aug 29 Python
python从zip中删除指定后缀文件(推荐)
Dec 05 Python
Django模板标签{% for %}循环,获取制定条数据实例
May 14 Python
python中requests模拟登录的三种方式(携带cookie/session进行请求网站)
Nov 17 Python
python标准库ElementTree处理xml
May 20 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
pw的一个放后门的方法分析
2007/10/08 PHP
PHP 长文章分页函数 带使用方法,不会分割段落,翻页在底部
2009/10/22 PHP
Thinkphp整合阿里云OSS图片上传实例代码
2019/04/28 PHP
thinkphp5 框架结合plupload实现图片批量上传功能示例
2020/04/04 PHP
几个比较经典常用的jQuery小技巧
2010/03/01 Javascript
javascript实现阻止iOS APP中的链接打开Safari浏览器
2014/06/12 Javascript
分享一个自己写的简单的javascript分页组件
2015/02/15 Javascript
纯js实现仿QQ邮箱弹出确认框
2015/04/29 Javascript
探讨JavaScript语句的执行过程
2016/01/28 Javascript
异步加载JS、CSS代码(推荐)
2016/06/15 Javascript
微信小程序 Image API实例详解
2016/09/30 Javascript
浅谈jQuery中事情的动态绑定
2017/02/12 Javascript
Vuex简单入门
2017/04/19 Javascript
利用node.js如何创建子进程详解
2017/12/09 Javascript
详解Angular中实现自定义组件的双向绑定的两种方法
2018/11/23 Javascript
简单了解常用的JavaScript 库
2020/07/16 Javascript
浅谈MySQL中的触发器
2015/05/05 Python
浅谈用Python实现一个大数据搜索引擎
2017/11/28 Python
python实现xlsx文件分析详解
2018/01/02 Python
Selenium chrome配置代理Python版的方法
2018/11/29 Python
python版百度语音识别功能
2019/07/09 Python
python读取指定字节长度的文本方法
2019/08/27 Python
关于matplotlib-legend 位置属性 loc 使用说明
2020/05/16 Python
Python爬取YY评级分数并保存数据实现过程解析
2020/06/01 Python
matplotlib 画双轴子图无法显示x轴的解决方法
2020/07/27 Python
实现Python3数组旋转的3种算法实例
2020/09/16 Python
院药学专业个人求职信
2013/09/21 职场文书
办公室主任先进事迹
2014/01/18 职场文书
幼儿园优秀教师事迹
2014/02/13 职场文书
公司联欢晚会主持词
2014/03/22 职场文书
2014年母亲节寄语
2014/05/07 职场文书
趣味运动会策划方案
2014/06/02 职场文书
关于教师节的演讲稿
2014/09/04 职场文书
会议新闻稿
2015/07/17 职场文书
小学语文教师研修感悟
2015/11/18 职场文书
小学班级管理心得体会
2016/01/07 职场文书