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 相关文章推荐
python3实现抓取网页资源的 N 种方法
May 02 Python
python自动登录12306并自动点击验证码完成登录的实现源代码
Apr 25 Python
pandas数据集的端到端处理
Feb 18 Python
python 实现提取log文件中的关键句子,并进行统计分析
Dec 24 Python
Python爬虫JSON及JSONPath运行原理详解
Jun 04 Python
Python ckeditor富文本编辑器代码实例解析
Jun 22 Python
使用ITK-SNAP进行抠图操作并保存mask的实例
Jul 01 Python
Python常用数据分析模块原理解析
Jul 20 Python
python实现企业微信定时发送文本消息的示例代码
Nov 24 Python
Selenium+BeautifulSoup+json获取Script标签内的json数据
Dec 07 Python
pytorch 带batch的tensor类型图像显示操作
May 20 Python
Python pandas读取CSV文件的注意事项(适合新手)
Jun 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
2020年4月放送!《Princess Connect Re:Dive》制作组 & 角色声优公开!
2020/03/06 日漫
PHP学习笔记(二) 了解PHP的基本语法以及目录结构
2014/08/04 PHP
PHP5.6读写excel表格文件操作示例
2019/02/26 PHP
php计数排序算法的实现代码(附四个实例代码)
2020/03/31 PHP
php获取小程序码的实现代码(B类接口)
2020/06/13 PHP
js实现的仿新浪微博完美的时间组件升级版
2011/12/20 Javascript
jQuery之尺寸调整组件的深入解析
2013/06/19 Javascript
js实现完全自定义可带多级目录的网页鼠标右键菜单方法
2015/02/28 Javascript
在JavaScript中处理字符串之link()方法的使用
2015/06/08 Javascript
前端框架学习总结之Angular、React与Vue的比较详解
2017/03/14 Javascript
关于TypeScript中import JSON的正确姿势详解
2017/07/25 Javascript
微信小程序实现图片预览功能
2018/01/31 Javascript
JavaScript正则表达式函数总结(常用)
2018/02/22 Javascript
三分钟学会用ES7中的Async/Await进行异步编程
2018/06/14 Javascript
微信小程序实现的3d轮播图效果示例【基于swiper组件】
2018/12/11 Javascript
JavaScript时间日期操作实例小结【5个示例】
2018/12/22 Javascript
jQuery中实现text()的方法
2019/04/04 jQuery
Python中序列的修改、散列与切片详解
2017/08/27 Python
Python面向对象之类的内置attr属性示例
2018/12/14 Python
python使用Pandas库提升项目的运行速度过程详解
2019/07/12 Python
Python 二叉树的层序建立与三种遍历实现详解
2019/07/29 Python
python利用re,bs4,requests模块获取股票数据
2019/07/29 Python
torch 中各种图像格式转换的实现方法
2019/12/26 Python
css3中transition属性详解
2014/09/02 HTML / CSS
美国巧克力喷泉品牌:Sephra
2019/05/05 全球购物
如何使用PHP session
2015/04/21 面试题
Java提供了哪些企业应用编程接口
2015/02/13 面试题
网页设计个人找工作求职信
2013/11/28 职场文书
《美丽的南沙群岛》教学反思
2014/04/27 职场文书
户籍证明书标准模板
2014/09/10 职场文书
走群众路线学习笔记
2014/11/06 职场文书
2015小学毕业班工作总结
2015/07/21 职场文书
2016年“世界气象日”广播稿
2015/12/17 职场文书
煤矿安全学习心得体会
2016/01/18 职场文书
《认识钟表》教学反思
2016/02/16 职场文书
2016年优秀班主任先进事迹材料
2016/02/26 职场文书