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实现网站文件的全备份和差异备份
Nov 30 Python
python中ASCII码和字符的转换方法
Jul 09 Python
对python mayavi三维绘图的实现详解
Jan 08 Python
把JSON数据格式转换为Python的类对象方法详解(两种方法)
Jun 04 Python
Python3.0 实现决策树算法的流程
Aug 08 Python
python3.x 生成3维随机数组实例
Nov 28 Python
在win64上使用bypy进行百度网盘文件上传功能
Jan 02 Python
python3检查字典传入函数键是否齐全的实例
Jun 05 Python
python基本算法之实现归并排序(Merge sort)
Sep 01 Python
python如何实时获取tcpdump输出
Sep 16 Python
Pycharm Available Package无法显示/安装包的问题Error Loading Package List解决
Sep 18 Python
Scrapy 配置动态代理IP的实现
Sep 28 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
使用网络地址转换实现多服务器负载均衡
2006/10/09 PHP
构建简单的Webmail系统
2006/10/09 PHP
PHP5+UTF8多文件上传类
2008/10/17 PHP
php中判断数组是一维,二维,还是多维的解决方法
2013/05/04 PHP
CURL的学习和应用(附多线程实现)
2013/06/03 PHP
php 二维数组时间排序实现代码
2016/11/19 PHP
PHP使用mongoclient简单操作mongodb数据库示例
2019/02/08 PHP
PHP字符串和十六进制如何实现互相转换
2020/07/16 PHP
利用nodejs监控文件变化并使用sftp上传到服务器
2017/02/18 NodeJs
JS利用cookies设置每隔24小时弹出框
2017/04/20 Javascript
一份超级详细的Vue-cli3.0使用教程【推荐】
2018/11/15 Javascript
解决VUE项目localhost端口服务器拒绝连接,只能用127.0.0.1的问题
2020/08/14 Javascript
Vue axios获取token临时令牌封装案例
2020/09/11 Javascript
深入理解Python对Json的解析
2017/02/14 Python
python SQLAlchemy 中的Engine详解
2019/07/04 Python
flask框架jinja2模板与模板继承实例分析
2019/08/01 Python
Django Docker容器化部署之Django-Docker本地部署
2019/10/09 Python
解决django xadmin主题不显示和只显示bootstrap2的问题
2020/03/30 Python
基于CSS3实现的几个小loading效果
2018/09/27 HTML / CSS
html5 Canvas画图教程(3)—canvas出现1像素线条模糊不清的原因
2013/01/09 HTML / CSS
HTML5、Select下拉框右边加图标的实现代码(增进用户体验)
2017/10/16 HTML / CSS
Lacoste澳大利亚官网:服装、鞋类及配饰
2018/11/14 全球购物
英国著名药妆店:Superdrug
2021/02/13 全球购物
办公室文秘自我鉴定
2013/09/21 职场文书
蔬菜基地的创业计划书
2014/01/06 职场文书
市场营销个人求职信范文
2014/02/02 职场文书
深入开展党的群众路线教育实践活动方案
2014/02/04 职场文书
小学模范班主任事迹材料
2014/05/13 职场文书
国庆宣传标语
2014/06/30 职场文书
大专应届毕业生求职信
2014/07/15 职场文书
2014年流动人口工作总结
2014/11/26 职场文书
婚内分居协议书范文
2014/11/26 职场文书
创业不要错过,这4种餐饮新模式
2019/07/18 职场文书
导游词之徐州云龙湖
2019/11/19 职场文书
vue实现锚点定位功能
2021/06/29 Vue.js
详解flex:1什么意思
2022/07/23 HTML / CSS