详解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装饰器实现重试机制内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Django中的用户身份验证示例详解

    Django中的用户身份验证示例详解

    这篇文章主要给大家介绍了关于Django中用户身份验证的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用SQL Django具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-08-08
  • Pytorch实现的手写数字mnist识别功能完整示例

    Pytorch实现的手写数字mnist识别功能完整示例

    这篇文章主要介绍了Pytorch实现的手写数字mnist识别功能,结合完整实例形式分析了Pytorch模块手写字识别具体步骤与相关实现技巧,需要的朋友可以参考下
    2019-12-12
  • python 获取等间隔的数组实例

    python 获取等间隔的数组实例

    今天小编就为大家分享一篇python 获取等间隔的数组实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-07-07
  • Python安装第三方库的3种方法

    Python安装第三方库的3种方法

    这篇文章主要介绍了Python安装第三方库的3种方法,本文讲解了通过setuptools来安装python模块、通过pip来安装python模块、直接从网上下载下可执行文件来安装三种方法,需要的朋友可以参考下
    2015-06-06
  • Pytorch模型转onnx模型实例

    Pytorch模型转onnx模型实例

    今天小编就为大家分享一篇Pytorch模型转onnx模型实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-01-01
  • numpy concatenate数组拼接方法示例介绍

    numpy concatenate数组拼接方法示例介绍

    这篇文章主要介绍了numpy concatenate数组拼接方法示例介绍,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-05-05
  • Python判断回文链表的方法

    Python判断回文链表的方法

    这篇文章主要介绍了Python判断回文链表,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-01-01
  • Python 实现输入任意多个数,并计算其平均值的例子

    Python 实现输入任意多个数,并计算其平均值的例子

    今天小编就为大家分享一篇Python 实现输入任意多个数,并计算其平均值的例子,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-07-07
  • 使用python提取PowerPoint中的音频和视频

    使用python提取PowerPoint中的音频和视频

    将多种格式的媒体内容进行重新利用(如PowerPoint演示中的音频和视频)是非常有价值的,从演示文稿中提取这些媒体文件可以为多媒体内容的多次使用提供更大的灵活性,本文将演示如何使用Python从PowerPoint演示文稿中提取音频和视频,需要的朋友可以参考下
    2024-09-09
  • Python实现GUI学生信息管理系统

    Python实现GUI学生信息管理系统

    这篇文章主要为大家详细介绍了Python实现GUI学生信息管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01

最新评论