欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解Python如何利用裝飾器實(shí)現(xiàn)重試機(jī)制

 更新時(shí)間:2024年03月29日 14:53:45   作者:databook  
重試機(jī)制在編程中是比較常見(jiàn)的場(chǎng)景,主要被用于處理那些可能由于臨時(shí)性故障或網(wǎng)絡(luò)波動(dòng)等原因而失敗的操作,下面我們就來(lái)看看如何使用裝飾器來(lái)實(shí)現(xiàn)重試機(jī)制吧

重試機(jī)制在編程中是比較常見(jiàn)的場(chǎng)景,主要被用于處理那些可能由于臨時(shí)性故障或網(wǎng)絡(luò)波動(dòng)等原因而失敗的操作。

本文介紹如何通過(guò)Python裝飾器來(lái)實(shí)現(xiàn)重試機(jī)制,從而能夠在盡量少修改現(xiàn)有代碼的基礎(chǔ)上,給其中某些函數(shù)加上重試機(jī)制

1. 概要

關(guān)于Python的裝飾器,只是一個(gè)語(yǔ)法糖,原理也比較簡(jiǎn)單,這里不在贅述。

關(guān)于為什么要用重試機(jī)制,

首先,它能顯著提高了系統(tǒng)的穩(wěn)定性和可靠性。

因?yàn)?,在分布式系統(tǒng)、網(wǎng)絡(luò)通信或任何涉及外部資源調(diào)用的場(chǎng)景中,失敗和異常是難以避免的。

通過(guò)引入重試機(jī)制,系統(tǒng)能夠在遇到這些臨時(shí)性故障時(shí)自動(dòng)恢復(fù),減少因單次失敗導(dǎo)致的整體服務(wù)中斷。

其次,重試機(jī)制有助于提升用戶體驗(yàn)。

對(duì)于用戶來(lái)說(shuō),如果系統(tǒng)因?yàn)橐淮尉W(wǎng)絡(luò)抖動(dòng)或短暫的服務(wù)器不可用就拋出錯(cuò)誤,那么用戶可能會(huì)感到不滿。

通過(guò)重試機(jī)制,系統(tǒng)可以在用戶幾乎無(wú)感知的情況下恢復(fù)服務(wù),從而提升用戶體驗(yàn)。

此外,重試機(jī)制還可以幫助系統(tǒng)更好地應(yīng)對(duì)突發(fā)的高負(fù)載或資源緊張的情況。

當(dāng)系統(tǒng)面臨大量請(qǐng)求或資源爭(zhēng)用時(shí),某些操作可能會(huì)因?yàn)橘Y源不足而失敗。

通過(guò)合理設(shè)置重試間隔和重試次數(shù),系統(tǒng)可以平滑地處理這些突發(fā)情況,避免因?yàn)槎虝旱馁Y源不足而導(dǎo)致服務(wù)崩潰。

2. 實(shí)現(xiàn)重試機(jī)制

下面是我目前在用的一個(gè)重試裝飾器:

from functools import wraps
from time import sleep


def retry(retries: int = 3, delay: float = 1):
    """
    函數(shù)執(zhí)行失敗時(shí),重試

    :param retries: 最大重試的次數(shù)
    :param delay: 每次重試的間隔時(shí)間,單位 秒
    :return:
    """

    # 校驗(yàn)重試的參數(shù),參數(shù)值不正確時(shí)使用默認(rèn)參數(shù)
    if retries < 1 or delay <= 0:
        retries = 3
        delay = 1

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

        return wrapper

    return decorator

這個(gè)裝飾器有兩個(gè)參數(shù),一個(gè)是重試次數(shù)(retries),一個(gè)是每次重試的間隔(delay)。

代碼比較簡(jiǎn)單,通過(guò)捕獲函數(shù)func的異常來(lái)重試,重試次數(shù)達(dá)到最大重試次數(shù)后退出。

3. 使用重試機(jī)制示例

使用上面裝飾器的示例:

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}]: 開始調(diào)用支付接口")
    raise Exception("調(diào)用支付接口超時(shí)...")


@retry(retries=5, delay=1)
def third():
    now = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
    print(f"[{now}]: 開始調(diào)用第三方接口")
    raise Exception("調(diào)用第三方接口超時(shí)...")


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

模擬一個(gè)支付接口,一個(gè)調(diào)用第三方的接口,分別看看重試的效果。

簡(jiǎn)簡(jiǎn)單單給函數(shù)加一個(gè)@retry,就有了重試功能。

4. 總結(jié)

總之,在設(shè)計(jì)和開發(fā)系統(tǒng)時(shí),合理地引入和應(yīng)用重試機(jī)制是非常必要的,尤其是需要大量調(diào)用第三方服務(wù)的時(shí)候。

通過(guò)裝飾器的方式來(lái)實(shí)現(xiàn)重試機(jī)制,能夠盡量少的侵入代碼的業(yè)務(wù)邏輯,是一種優(yōu)雅靈活的方式。

到此這篇關(guān)于詳解Python如何利用裝飾器實(shí)現(xiàn)重試機(jī)制的文章就介紹到這了,更多相關(guān)Python裝飾器實(shí)現(xiàn)重試機(jī)制內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Django中的用戶身份驗(yàn)證示例詳解

    Django中的用戶身份驗(yàn)證示例詳解

    這篇文章主要給大家介紹了關(guān)于Django中用戶身份驗(yàn)證的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用SQL Django具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • Pytorch實(shí)現(xiàn)的手寫數(shù)字mnist識(shí)別功能完整示例

    Pytorch實(shí)現(xiàn)的手寫數(shù)字mnist識(shí)別功能完整示例

    這篇文章主要介紹了Pytorch實(shí)現(xiàn)的手寫數(shù)字mnist識(shí)別功能,結(jié)合完整實(shí)例形式分析了Pytorch模塊手寫字識(shí)別具體步驟與相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2019-12-12
  • python 獲取等間隔的數(shù)組實(shí)例

    python 獲取等間隔的數(shù)組實(shí)例

    今天小編就為大家分享一篇python 獲取等間隔的數(shù)組實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-07-07
  • Python安裝第三方庫(kù)的3種方法

    Python安裝第三方庫(kù)的3種方法

    這篇文章主要介紹了Python安裝第三方庫(kù)的3種方法,本文講解了通過(guò)setuptools來(lái)安裝python模塊、通過(guò)pip來(lái)安裝python模塊、直接從網(wǎng)上下載下可執(zhí)行文件來(lái)安裝三種方法,需要的朋友可以參考下
    2015-06-06
  • Pytorch模型轉(zhuǎn)onnx模型實(shí)例

    Pytorch模型轉(zhuǎn)onnx模型實(shí)例

    今天小編就為大家分享一篇Pytorch模型轉(zhuǎn)onnx模型實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-01-01
  • numpy concatenate數(shù)組拼接方法示例介紹

    numpy concatenate數(shù)組拼接方法示例介紹

    這篇文章主要介紹了numpy concatenate數(shù)組拼接方法示例介紹,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05
  • Python判斷回文鏈表的方法

    Python判斷回文鏈表的方法

    這篇文章主要介紹了Python判斷回文鏈表,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-01-01
  • Python 實(shí)現(xiàn)輸入任意多個(gè)數(shù),并計(jì)算其平均值的例子

    Python 實(shí)現(xiàn)輸入任意多個(gè)數(shù),并計(jì)算其平均值的例子

    今天小編就為大家分享一篇Python 實(shí)現(xiàn)輸入任意多個(gè)數(shù),并計(jì)算其平均值的例子,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-07-07
  • 使用python提取PowerPoint中的音頻和視頻

    使用python提取PowerPoint中的音頻和視頻

    將多種格式的媒體內(nèi)容進(jìn)行重新利用(如PowerPoint演示中的音頻和視頻)是非常有價(jià)值的,從演示文稿中提取這些媒體文件可以為多媒體內(nèi)容的多次使用提供更大的靈活性,本文將演示如何使用Python從PowerPoint演示文稿中提取音頻和視頻,需要的朋友可以參考下
    2024-09-09
  • Python實(shí)現(xiàn)GUI學(xué)生信息管理系統(tǒng)

    Python實(shí)現(xiàn)GUI學(xué)生信息管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了Python實(shí)現(xiàn)GUI學(xué)生信息管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-01-01

最新評(píng)論