详解Python如何利用装饰器实现重试机制

 更新时间:2024年03月29日 14:53:45   作者:databook  
重试机制在编程中是比较常见的场景,主要被用于处理那些可能由于临时性故障或网络波动等原因而失败的操作,下面我们就来看看如何使用装饰器来实现重试机制吧

重试机制在编程中是比较常见的场景,主要被用于处理那些可能由于临时性故障或网络波动等原因而失败的操作。

本文介绍如何通过Python装饰器来实现重试机制,从而能够在尽量少修改现有代码的基础上,给其中某些函数加上重试机制

1. 概要

关于Python的装饰器,只是一个语法糖,原理也比较简单,这里不在赘述。

关于为什么要用重试机制

首先,它能显著提高了系统的稳定性和可靠性。

因为,在分布式系统、网络通信或任何涉及外部资源调用的场景中,失败和异常是难以避免的。

通过引入重试机制,系统能够在遇到这些临时性故障时自动恢复,减少因单次失败导致的整体服务中断。

其次,重试机制有助于提升用户体验。

对于用户来说,如果系统因为一次网络抖动或短暂的服务器不可用就抛出错误,那么用户可能会感到不满。

通过重试机制,系统可以在用户几乎无感知的情况下恢复服务,从而提升用户体验。

此外,重试机制还可以帮助系统更好地应对突发的高负载或资源紧张的情况。

当系统面临大量请求或资源争用时,某些操作可能会因为资源不足而失败。

通过合理设置重试间隔和重试次数,系统可以平滑地处理这些突发情况,避免因为短暂的资源不足而导致服务崩溃。

2. 实现重试机制

下面是我目前在用的一个重试装饰器:

from functools import wraps
from time import sleep


def retry(retries: int = 3, delay: float = 1):
    """
    函数执行失败时,重试

    :param retries: 最大重试的次数
    :param delay: 每次重试的间隔时间,单位 秒
    :return:
    """

    # 校验重试的参数,参数值不正确时使用默认参数
    if retries < 1 or delay <= 0:
        retries = 3
        delay = 1

    def decorator(func):
        @wraps(func)
        def wrapper(*args, **kwargs):
            # 第一次正常执行不算重试次数,所以retries+1
            for i in range(retries + 1):
                try:
                    return func(*args, **kwargs)
                except Exception as e:
                    # 检查重试次数
                    if i == retries:
                        print(f"Error: {repr(e)}")
                        print(f'"{func.__name__}()" 执行失败,已重试{retries}次')
                        break
                    else:
                        print(
                            f"Error: {repr(e)},{delay}秒后第[{i+1}/{retries}]次重试..."
                        )
                        sleep(delay)

        return wrapper

    return decorator

这个装饰器有两个参数,一个是重试次数(retries),一个是每次重试的间隔(delay)。

代码比较简单,通过捕获函数func的异常来重试,重试次数达到最大重试次数后退出。

3. 使用重试机制示例

使用上面装饰器的示例:

from decorators import retry
import time


@retry(retries=2, delay=2)
def pay():
    now = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
    print(f"[{now}]: 开始调用支付接口")
    raise Exception("调用支付接口超时...")


@retry(retries=5, delay=1)
def third():
    now = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
    print(f"[{now}]: 开始调用第三方接口")
    raise Exception("调用第三方接口超时...")


if __name__ == "__main__":
    pay()  # 重试2次,每次间隔2秒
    third()  # 重试5次,每次间隔1秒

模拟一个支付接口,一个调用第三方的接口,分别看看重试的效果。

简简单单给函数加一个@retry,就有了重试功能。

4. 总结

总之,在设计和开发系统时,合理地引入和应用重试机制是非常必要的,尤其是需要大量调用第三方服务的时候。

通过装饰器的方式来实现重试机制,能够尽量少的侵入代码的业务逻辑,是一种优雅灵活的方式。

到此这篇关于详解Python如何利用装饰器实现重试机制的文章就介绍到这了,更多相关Python装饰器实现重试机制内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • python实现二分类的卡方分箱示例

    python实现二分类的卡方分箱示例

    今天小编就为大家分享一篇python实现二分类的卡方分箱示例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-11-11
  • python实现ftp客户端示例分享

    python实现ftp客户端示例分享

    这篇文章主要介绍了python实现ftp客户端示例,包括ftp的常见任务,上传,下载,删除,更名等功能,需要的朋友可以参考下
    2014-02-02
  • python监控键盘输入实例代码

    python监控键盘输入实例代码

    这篇文章主要介绍了python监控键盘输入实例代码,分享了相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
    2018-02-02
  • Python利用Tiler制作专属卡通头像和LOGO

    Python利用Tiler制作专属卡通头像和LOGO

    Tiler是一种使用各种其他较小图像平铺创建新图像的工具,它与其他马赛克工具不同,因为它可以适应多种形状、大小、方向的贴图,称为buil in build。本文就来利用Tiler制作专属卡通头像和LOGO,需要的可以参考一下
    2022-12-12
  • Python对ElasticSearch获取数据及操作

    Python对ElasticSearch获取数据及操作

    这篇文章主要为大家详细介绍了Python对ElasticSearch获取数据及操作,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-04-04
  • Python抓取Discuz!用户名脚本代码

    Python抓取Discuz!用户名脚本代码

    这篇文章主要介绍了Python抓取Discuz!用户名脚本代码,有需要的朋友可以参考一下
    2013-12-12
  • Python函数返回不定数量的值方法

    Python函数返回不定数量的值方法

    今天小编就为大家分享一篇Python函数返回不定数量的值方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-01-01
  • Python正则表达式中的'r'用法总结

    Python正则表达式中的'r'用法总结

    正则表达式即使用一个字符串来描述、匹配一系列某个语法规则的字符串,python中r作用是除去''里面转意字符,在pyhton自动化中比较常用的,下面这篇文章主要给大家介绍了关于Python正则表达式中的'r'用法总结的相关资料,需要的朋友可以参考下
    2023-04-04
  • Python打包方法Pyinstaller的使用

    Python打包方法Pyinstaller的使用

    在我们完成一个Python项目或一个程序时,希望将Python的py文件打包成在Windows系统下直接可以运行的exe程序。这篇文章主要介绍了Python打包方法Pyinstaller的使用,感兴趣的小伙伴们可以参考一下
    2018-10-10
  • 详解python中groupby函数通俗易懂

    详解python中groupby函数通俗易懂

    这篇文章主要介绍了详解python中groupby函数通俗易懂,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-05-05

最新评论