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使用pyhook监控键盘并实现切换歌曲的功能
Jul 18 Python
在Python中使用CasperJS获取JS渲染生成的HTML内容的教程
Apr 09 Python
python开发利器之ulipad的使用实践
Mar 16 Python
Python读取指定目录下指定后缀文件并保存为docx
Apr 23 Python
Python使用functools实现注解同步方法
Feb 06 Python
谈谈python中GUI的选择
Mar 01 Python
Python根据已知邻接矩阵绘制无向图操作示例
Jun 23 Python
Django  ORM 练习题及答案
Jul 19 Python
python 爬取古诗文存入mysql数据库的方法
Jan 08 Python
Python函数默认参数常见问题及解决方案
Mar 26 Python
五分钟学会怎么用python做一个简单的贪吃蛇
Jan 12 Python
Python Pandas pandas.read_sql_query函数实例用法分析
Jun 21 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
ini_set的用法介绍
2014/01/07 PHP
PHP中使用asort进行中文排序失效的问题处理
2014/08/18 PHP
PHP读取CSV大文件导入数据库的实例
2017/07/24 PHP
在修改准备发的批量美化select+可修改select时,在非IE下发现了几个问题
2007/01/09 Javascript
jQuery each()小议
2010/03/18 Javascript
javascript日期转换 时间戳转日期格式
2011/11/05 Javascript
js中apply方法的使用详细解析
2013/11/04 Javascript
jquery中show()、hide()和toggle()用法实例
2015/01/15 Javascript
jQuery基础_入门必看知识点
2016/07/04 Javascript
JS中正则表达式只有3种匹配模式(没有单行模式)详解
2016/07/28 Javascript
jQuery+Ajax请求本地数据加载商品列表页并跳转详情页的实现方法
2017/07/12 jQuery
js学习总结_轮播图之渐隐渐现版(实例讲解)
2017/07/17 Javascript
Javascript ES6中对象类型Sets的介绍与使用详解
2017/07/17 Javascript
解决vue页面DOM操作不生效的问题
2018/03/17 Javascript
一份超级详细的Vue-cli3.0使用教程【推荐】
2018/11/15 Javascript
vue中node_modules中第三方模块的修改使用详解
2019/05/31 Javascript
vue路由教程之静态路由
2019/09/03 Javascript
vue prop传值类型检验方式
2020/07/30 Javascript
深度剖析使用python抓取网页正文的源码
2014/06/11 Python
Python 稀疏矩阵-sparse 存储和转换
2017/05/27 Python
使用Python向C语言的链接库传递数组、结构体、指针类型的数据
2019/01/29 Python
python获取地震信息 微信实时推送
2019/06/18 Python
python和c语言的主要区别总结
2019/07/07 Python
Python绘制股票移动均线的实例
2019/08/24 Python
Python ORM编程基础示例
2020/02/02 Python
从python读取sql的实例方法
2020/07/21 Python
python/golang实现循环链表的示例代码
2020/09/14 Python
python实现双人五子棋(终端版)
2020/12/30 Python
为你的html5网页添加音效示例
2014/04/03 HTML / CSS
大学生村官演讲稿
2014/04/25 职场文书
操行评语大全
2014/04/30 职场文书
教代会闭幕词
2015/01/28 职场文书
2015年社区教育工作总结
2015/05/13 职场文书
创业计划书之青年旅馆
2019/09/23 职场文书
python入门之算法学习
2021/04/22 Python
pytorch中的model=model.to(device)使用说明
2021/05/24 Python