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爬虫之爬虫框架Scrapy安装配置
Nov 06 Python
python开发之IDEL(Python GUI)的使用方法图文详解
Nov 12 Python
python http接口自动化脚本详解
Jan 02 Python
浅谈python连续赋值可能引发的错误
Nov 10 Python
为何人工智能(AI)首选Python?读完这篇文章你就知道了(推荐)
Apr 06 Python
python频繁写入文件时提速的方法
Jun 26 Python
python实现按行分割文件
Jul 22 Python
Django admin model 汉化显示文字的实现方法
Aug 12 Python
python实现代码统计程序
Sep 19 Python
python实现IOU计算案例
Apr 12 Python
python中导入 train_test_split提示错误的解决
Jun 19 Python
浅谈keras中Dropout在预测过程中是否仍要起作用
Jul 09 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开发框架总结收藏
2008/04/24 PHP
php+ajax做仿百度搜索下拉自动提示框(有实例)
2012/08/21 PHP
PHP无法访问远程mysql的问题分析及解决
2013/05/16 PHP
php递归遍历多维数组的方法
2015/04/18 PHP
百度地图经纬度转换到腾讯地图/Google 对应的经纬度
2015/08/28 PHP
Laravel 中使用简单的方法跟踪用户是否在线(推荐)
2019/10/30 PHP
Jquery知识点一 Jquery的ready和Dom的onload的区别
2011/01/15 Javascript
Javascript控制input输入时间格式的方法
2015/01/28 Javascript
利用JS提交表单的几种方法和验证(必看篇)
2016/09/17 Javascript
bootstrap daterangepicker双日历时间段选择控件详解
2017/06/15 Javascript
ionic选择多张图片上传的示例代码
2017/10/10 Javascript
原生JS实现动态添加新元素、删除元素方法
2019/05/05 Javascript
详解用js代码触发dom事件的实现方案
2020/06/10 Javascript
Python实现去除代码前行号的方法
2015/03/10 Python
编写Python脚本批量下载DesktopNexus壁纸的教程
2015/05/06 Python
pandas通过索引进行排序的示例
2018/11/16 Python
Python+opencv 实现图片文字的分割的方法示例
2019/07/04 Python
python 返回一个列表中第二大的数方法
2019/07/09 Python
python3中关于excel追加写入格式被覆盖问题(实例代码)
2020/01/10 Python
python随机生成大小写字母数字混合密码(仅20行代码)
2020/02/01 Python
Python Django路径配置实现过程解析
2020/11/05 Python
python 30行代码实现蚂蚁森林自动偷能量
2021/02/08 Python
CSS3使用transition实现的鼠标悬停淡入淡出
2015/01/09 HTML / CSS
Tirendo比利时:在线购买轮胎
2018/10/22 全球购物
澳大利亚领先的在线药房:Pharmacy Online(有中文站)
2020/02/22 全球购物
最新远光软件笔试题面试题内容
2013/11/08 面试题
助人为乐表扬信范文
2014/01/14 职场文书
纪检干部个人对照检查材料
2014/09/23 职场文书
党支部2014年度工作总结
2014/12/04 职场文书
监考失职检讨书
2015/01/26 职场文书
大学生社会实践活动总结报告
2015/05/06 职场文书
党小组考察意见
2015/06/02 职场文书
中秋晚会致辞
2015/07/31 职场文书
商务信函英语问候语
2015/11/10 职场文书
详解Python常用的魔法方法
2021/06/03 Python
Golang 实现 WebSockets 之创建 WebSockets
2022/04/24 Golang