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 相关文章推荐
SublimeText 2编译python出错的解决方法(The system cannot find the file specified)
Nov 27 Python
Python列表(list)、字典(dict)、字符串(string)基本操作小结
Nov 28 Python
Python调用C语言开发的共享库方法实例
Mar 18 Python
Python Property属性的2种用法
Jun 21 Python
Python实现Linux监控的方法
May 16 Python
python tkinter canvas 显示图片的示例
Jun 13 Python
python实现Dijkstra算法的最短路径问题
Jun 21 Python
python新式类和经典类的区别实例分析
Mar 23 Python
python+selenium+chromedriver实现爬虫示例代码
Apr 10 Python
python实现图片转换成素描和漫画格式
Aug 19 Python
python -v 报错问题的解决方法
Sep 15 Python
使用python+pygame开发消消乐游戏附完整源码
Jun 10 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 strncasecmp字符串比较的小技巧
2011/01/04 PHP
Zend Framework教程之Zend_Db_Table表关联实例详解
2016/03/23 PHP
PHP实现找出有序数组中绝对值最小的数算法分析
2017/08/07 PHP
TP5框架实现一次选择多张图片并预览的方法示例
2020/04/04 PHP
写的htc的数据表格
2007/01/20 Javascript
JS学习之一个简易的日历控件
2010/03/24 Javascript
jquery的ajaxSubmit()异步上传图片并保存表单数据演示代码
2013/06/04 Javascript
cookie.js 加载顺序问题怎么才有效
2013/07/31 Javascript
javascript实现继承的简单实例
2015/07/26 Javascript
jq实现左侧显示图片右侧文字滑动切换效果
2015/08/04 Javascript
JS自定义选项卡函数及用法实例分析
2015/09/02 Javascript
全面解析Bootstrap表单使用方法(表单控件)
2015/11/24 Javascript
AngularJS Phonecat实例讲解
2016/11/21 Javascript
使用bootstrap-paginator.js 分页来进行ajax 异步分页请求示例
2017/03/09 Javascript
js清除浏览器缓存的几种方法
2017/03/15 Javascript
JSON.stringify()方法讲解
2019/01/31 Javascript
node.js命令行教程图文详解
2019/05/27 Javascript
微信小程序在ios下Echarts图表不能滑动的问题解决
2019/07/10 Javascript
[02:33]DOTA2亚洲邀请赛趣味视频之吐真话筒
2018/03/31 DOTA
怎样使用Python脚本日志功能
2016/08/14 Python
用tensorflow搭建CNN的方法
2018/03/05 Python
简单实现python聊天程序
2018/04/01 Python
pip安装时ReadTimeoutError的解决方法
2018/06/12 Python
python 如何去除字符串头尾的多余符号
2019/11/19 Python
python 解决cv2绘制中文乱码问题
2019/12/23 Python
解决redis与Python交互取出来的是bytes类型的问题
2020/07/16 Python
css3 边框、背景、文本效果的实现代码
2018/03/21 HTML / CSS
运动会领导邀请函
2014/01/10 职场文书
副科竞争上岗演讲稿
2014/05/12 职场文书
爱耳日宣传活动总结
2014/07/05 职场文书
房产销售独家委托书范本
2014/10/01 职场文书
单位综合评价意见
2015/06/05 职场文书
基督教追悼会答谢词
2015/09/29 职场文书
2016学习医德医风心得体会
2016/01/25 职场文书
同学会演讲稿
2019/04/02 职场文书
Win10开机修复磁盘错误怎么跳过?Win10关闭开机磁盘检查的方法
2022/09/23 数码科技