python重试装饰器的简单实现方法
作者:BlackMatrix 发布时间:2022-07-15 12:54:10
标签:python,重试,装饰器
简单实现了一个在函数执行出现异常时自动重试的装饰器,支持控制最多重试次数,每次重试间隔,每次重试间隔时间递增。
最新的代码可以访问从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
来源:https://www.cnblogs.com/blackmatrix/p/7425435.html
0
投稿
猜你喜欢
- innerHTML 属性的使用非常流行,因为他提供了简单的方法完全替代一个 HTML 元素的内容。另外一个方法是使用 DOM Level 2
- 在.net 1.1中我们要实现压缩这一功能,一般都是用open source的SharpZipLib 或者调用
- PHP PDO 预处理语句与存储过程很多更成熟的数据库都支持预处理语句的概念。什么是预处理语句?可以把它看作是想要运行的 SQL 的一种编译
- 原文:http://blog.rexsong.com/?p=746#comments加速的关键,不是降低重量,而是减少个数。如果重量在200
- 主要功能在copyFiles()函数里实现,如下:def copyFiles(src, dst): sr
- 快速排序(QuickSort)是对冒泡排序的一种改进:基本思想:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一
- 安装了python3之后,会有pip31. 使用pip install XXX新安装的库会放在这个目录下面python2.7/site-pa
- python爬虫用mongodb的原因:1、文档结构的存储方式简单讲就是可以直接存json,list2、不要事先定义”表”,随时可以创建3、
- 占位符通过占位符,可以指定格式进行输入或输出,以下为 fmt 标准库里的占位符:普通占位符占位符描述举例结果%v默认格式的值fmt.Prin
- Ajax的流行给用户体验带来了很大程序的提升,而“注册“这项做为互联网最常用到的功能也自然而然的成为Ajax最常光顾的地方,实时判断用户输入
- 一个很普通的网页中显示LOGO图像,按照以往的页面制作经验,基本是在页面中插入图像即可(<img src="logo.gif
- 1、pyqtgraph库数据可视化效果还不错,特别是窗体程序中图像交互性较好;安装也很方便,用 pip 安装。2、在Python中新建一个
- Mcrypt扩展库可以实现加密解密功能,就是既能将明文加密,也可以密文还原。1.PHP加密扩展库Mcrypt安装在标准的PHP安装过程中并没
- 这篇文章主要介绍了PYTHON发送邮件YAGMAIL的简单实现解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价
- 随机背景--当你每次进入该页面时,从已指定的图片文件夹中,随机选取一个图片作为背景显示。这里介绍的方法是用ASP+CSS来实现的。 &nbs
- python 中提供一种用于对函数固定属性的函数(与数学上的偏函数不一样)# 通常会返回10进制int('12345') &
- 这里主要是讲在asp下两次由access数据库升级到sql server数据库后的经验及注意事项,其它语言也可以参考一下。欢迎讨论补充。1.
- 阅读上一篇:FrontPage2002简明教程四:网页超级链接 一、三种添加CSS的方式 在FrontPage 2002里可以通过三种方式给
- 废话少说,直接上代码:<?php/** * Note:for octet-stream upload * 这个是流式上传PHP文件 *
- 微软在去年可谓是动作比较大的一年,在去年3月份推出了最新版的IE8浏览器,而在年底又发布全新的操作系统Windows 7,自此新产品的市场占