博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python重试装饰器的简单实现
阅读量:5741 次
发布时间:2019-06-18

本文共 2558 字,大约阅读时间需要 8 分钟。

简单实现了一个在函数执行出现异常时自动重试的装饰器,支持控制最多重试次数,每次重试间隔,每次重试间隔时间递增。

最新的代码可以访问从github上获取

#!/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: PyCharmimport timefrom 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 wrapperif __name__ == '__main__':    pass

 

转载于:https://www.cnblogs.com/blackmatrix/p/7425435.html

你可能感兴趣的文章
Postgres-X2部署步骤
查看>>
MODIS批量处理软件MRT的安装说明
查看>>
Python网络通信TCP客户端
查看>>
Redis笔记系列(一)——Redis精要介绍与适用场景
查看>>
java 连接MySql数据库
查看>>
架构设计:一种远程调用服务的设计构思(zookeeper的一种应用实践)
查看>>
Linux 系统病毒入侵分析
查看>>
文件操作(File)
查看>>
MySQL 常用函数详解
查看>>
Tomcat部署Web应用方法总结
查看>>
Spring Security 文档翻译 - 架构与实现之二核心服务
查看>>
解决[Errno 24] Too many open files
查看>>
Android之parseSDKContent failed
查看>>
docker nginx安装
查看>>
ntdll 里面的 DbgPrint
查看>>
给SVN泼盆冷水,是时候用GIT了
查看>>
ubuntu 14.04 NTP服务器搭建及某些故障排查
查看>>
netty 源码编译搭建
查看>>
openstack swift构建公有云
查看>>
JVM调优总结 -Xms -Xmx -Xmn -Xss
查看>>