侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

python重试装饰器的简单实现方法

Python  /  管理员 发布于 7年前   172

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

最新的代码可以访问从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: 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

以上这篇python重试装饰器的简单实现方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。


  • 上一条:
    Python实现删除排序数组中重复项的两种方法示例
    下一条:
    Python实现合并两个有序链表的方法示例
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 在python语言中Flask框架的学习及简单功能示例(0个评论)
    • 在Python语言中实现GUI全屏倒计时代码示例(0个评论)
    • Python + zipfile库实现zip文件解压自动化脚本示例(0个评论)
    • python爬虫BeautifulSoup快速抓取网站图片(1个评论)
    • vscode 配置 python3开发环境的方法(0个评论)
    • 近期文章
    • 智能合约Solidity学习CryptoZombie第三课:组建僵尸军队(高级Solidity理论)(0个评论)
    • 智能合约Solidity学习CryptoZombie第二课:让你的僵尸猎食(0个评论)
    • 智能合约Solidity学习CryptoZombie第一课:生成一只你的僵尸(0个评论)
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2018-04
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2022-01
    • 2023-07
    • 2023-10
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客