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 相关文章推荐
wxPython中listbox用法实例详解
Jun 01 Python
深入理解Python中的内置常量
May 20 Python
几种实用的pythonic语法实例代码
Feb 24 Python
Python 实现数据结构-堆栈和队列的操作方法
Jul 17 Python
python爬虫 爬取58同城上所有城市的租房信息详解
Jul 30 Python
python下载库的步骤方法
Oct 12 Python
Python 取numpy数组的某几行某几列方法
Oct 24 Python
Python Opencv中用compareHist函数进行直方图比较对比图片
Apr 07 Python
为什么称python为胶水语言
Jun 16 Python
python实现mask矩阵示例(根据列表所给元素)
Jul 30 Python
Python基于tkinter canvas实现图片裁剪功能
Nov 05 Python
python 装饰器的基本使用
Jan 13 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
收音机另类DIY - 纸巾盒做外壳
2021/03/02 无线电
CodeIgniter生成静态页的方法
2016/05/17 PHP
Laravel 中创建 Zip 压缩文件并提供下载的实现方法
2019/04/02 PHP
基于jquery1.4.2的仿flash超炫焦点图播放效果
2010/04/20 Javascript
JavaScript学习笔记记录我的旅程
2012/05/23 Javascript
js判断元素是否隐藏的方法
2014/06/09 Javascript
javascript同步服务器时间和同步倒计时小技巧
2015/09/24 Javascript
Node.js与Sails ~项目结构与Mvc实现及日志机制
2015/10/14 Javascript
js生成随机数的方法实例
2015/10/16 Javascript
使用jquery.form.js实现图片上传的方法
2016/05/05 Javascript
jQuery Easyui快速入门教程
2016/08/21 Javascript
JS 调用微信扫一扫功能
2016/12/22 Javascript
详解使用grunt完成requirejs的合并压缩和js文件的版本控制
2017/03/02 Javascript
vue基于Element构建自定义树的示例代码
2017/09/19 Javascript
基于打包工具Webpack进行项目开发实例
2018/05/29 Javascript
微信小程序时间戳转日期的详解
2019/04/30 Javascript
Vue组件模板的几种书写形式(3种)
2020/02/19 Javascript
Taro小程序自定义顶部导航栏功能的实现
2020/12/17 Javascript
[03:14]辉夜杯主赛事 12月25日每日之星
2015/12/26 DOTA
使用Python压缩和解压缩zip文件的教程
2015/05/06 Python
用Python的Flask框架结合MySQL写一个内存监控程序
2015/11/07 Python
python+pandas+时间、日期以及时间序列处理方法
2018/07/10 Python
Python实现查找数组中任意第k大的数字算法示例
2019/01/23 Python
pytorch多GPU并行运算的实现
2019/09/27 Python
详解pycharm连接不上mysql数据库的解决办法
2020/01/10 Python
Python3.9 beta2版本发布了,看看这7个新的PEP都是什么
2020/06/10 Python
定义css设备类型-Media Queries图表简介及使用方法
2013/01/21 HTML / CSS
Html5 APP中监听返回事件处理的方法示例
2018/03/15 HTML / CSS
HTML5 图片预加载的示例代码
2020/03/25 HTML / CSS
德国网上超市:myTime.de
2019/08/26 全球购物
大学生职业规划论文
2014/01/11 职场文书
我的小天地教学反思
2014/04/30 职场文书
暖春观后感
2015/06/08 职场文书
2016元旦主持人经典开场白台词
2015/12/03 职场文书
pytorch加载预训练模型与自己模型不匹配的解决方案
2021/05/13 Python
分享几个简单MySQL优化小妙招
2022/03/31 MySQL