0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Python 在什么情況下才進(jìn)行重試

科技綠洲 ? 來(lái)源:Python實(shí)用寶典 ? 作者:Python實(shí)用寶典 ? 2023-10-21 11:18 ? 次閱讀

為了避免由于一些網(wǎng)絡(luò)或等其他不可控因素,而引起的功能性問(wèn)題。比如在發(fā)送請(qǐng)求時(shí),會(huì)因?yàn)榫W(wǎng)絡(luò)不穩(wěn)定,往往會(huì)有請(qǐng)求超時(shí)的問(wèn)題。

這種情況下,我們通常會(huì)在代碼中加入重試的代碼。重試的代碼本身不難實(shí)現(xiàn),但如何寫(xiě)得優(yōu)雅、易用,是我們要考慮的問(wèn)題。

這里要給大家介紹的是一個(gè)第三方庫(kù) - Tenacity (標(biāo)題中的重試機(jī)制并并不準(zhǔn)確,它不是 Python 的內(nèi)置模塊,因此并不能稱(chēng)之為機(jī)制),它實(shí)現(xiàn)了幾乎我們可以使用到的所有重試場(chǎng)景,比如:

  1. 在什么情況下才進(jìn)行重試?
  2. 重試幾次呢?
  3. 重試多久后結(jié)束?
  4. 每次重試的間隔多長(zhǎng)呢?
  5. 重試失敗后的回調(diào)?

在使用它之前 ,先要安裝它

$ pip install tenacity

1. 最基本的重試

無(wú)條件重試,重試之間無(wú)間隔

from tenacity import retry

@retry
def test_retry():
    print("等待重試,重試無(wú)間隔執(zhí)行...")
    raise Exception

test_retry()

無(wú)條件重試,但是在重試之前要等待 2 秒

from tenacity import retry, wait_fixed

@retry(wait=wait_fixed(2))
def test_retry():
    print("等待重試...")
    raise Exception

test_retry()

2. 設(shè)置停止基本條件

只重試7 次

from tenacity import retry, stop_after_attempt

@retry(stop=stop_after_attempt(7))
def test_retry():
    print("等待重試...")
    raise Exception

test_retry()

重試 10 秒后不再重試

from tenacity import retry, stop_after_delay

@retry(stop=stop_after_delay(10))
def test_retry():
    print("等待重試...")
    raise Exception

test_retry()

或者上面兩個(gè)條件滿(mǎn)足一個(gè)就結(jié)束重試

from tenacity import retry, stop_after_delay, stop_after_attempt

@retry(stop=(stop_after_delay(10) | stop_after_attempt(7)))
def test_retry():
    print("等待重試...")
    raise Exception

test_retry()

3. 設(shè)置何時(shí)進(jìn)行重試

在出現(xiàn)特定錯(cuò)誤/異常(比如請(qǐng)求超時(shí))的情況下,再進(jìn)行重試

from requests import exceptions
from tenacity import retry, retry_if_exception_type

@retry(retry=retry_if_exception_type(exceptions.Timeout))
def test_retry():
    print("等待重試...")
    raise exceptions.Timeout

test_retry()

在滿(mǎn)足自定義條件時(shí),再進(jìn)行重試。

如下示例,當(dāng) test_retry 函數(shù)返回值為 False 時(shí),再進(jìn)行重試

from tenacity import retry, stop_after_attempt, retry_if_result

def is_false(value):
    return value is False

@retry(stop=stop_after_attempt(3),
       retry=retry_if_result(is_false))
def test_retry():
    return False

test_retry()

4. 重試后錯(cuò)誤重新拋出

當(dāng)出現(xiàn)異常后,tenacity 會(huì)進(jìn)行重試,若重試后還是失敗,默認(rèn)情況下,往上拋出的異常會(huì)變成 RetryError,而不是最根本的原因。

因此可以加一個(gè)參數(shù)reraise=True),使得當(dāng)重試失敗后,往外拋出的異常還是原來(lái)的那個(gè)。

from tenacity import retry, stop_after_attempt

@retry(stop=stop_after_attempt(7), reraise=True)
def test_retry():
    print("等待重試...")
    raise Exception

test_retry()

5. 設(shè)置回調(diào)函數(shù)

當(dāng)最后一次重試失敗后,可以執(zhí)行一個(gè)回調(diào)函數(shù)

from tenacity import *

def return_last_value(retry_state):
    print("執(zhí)行回調(diào)函數(shù)")
    return retry_state.outcome.result()  # 表示返回原函數(shù)的返回值

def is_false(value):
    return value is False

@retry(stop=stop_after_attempt(3),
       retry_error_callback=return_last_value,
       retry=retry_if_result(is_false))
def test_retry():
    print("等待重試中...")
    return False

print(test_retry())

輸出如下

等待重試中...
等待重試中...
等待重試中...
執(zhí)行回調(diào)函數(shù)
False
聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 模塊
    +關(guān)注

    關(guān)注

    7

    文章

    2613

    瀏覽量

    47017
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4237

    瀏覽量

    61969
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4671

    瀏覽量

    67770
  • python
    +關(guān)注

    關(guān)注

    53

    文章

    4753

    瀏覽量

    84081
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    請(qǐng)問(wèn)什么情況下需要使用通信協(xié)議

    最近有個(gè)客戶(hù)要做一個(gè)串口通信控制LED燈的板子當(dāng)時(shí)它問(wèn)我要用什么通信協(xié)議;我門(mén)在學(xué)習(xí)串口通信時(shí)并沒(méi)有學(xué)到什么通信協(xié)議把?在網(wǎng)上查了是有一些; 請(qǐng)問(wèn):什么情況下需要使用通信協(xié)議
    發(fā)表于 06-13 04:35

    什么情況下選用PCI板卡?什么情況下選用PXI板卡?

    測(cè)控選板卡方案時(shí),什么情況下選PCI,什么情況下選PXI?
    發(fā)表于 03-31 20:52

    什么情況下低壓線(xiàn)路保護(hù)中要求配置零序電流互感器

    什么情況下低壓線(xiàn)路保護(hù)中要求配置零序電流互感器?如何選擇零序電流互感器一次電流值?如何進(jìn)行安裝?定值如何整定?
    發(fā)表于 08-09 07:35

    PCB數(shù)字地模擬地怎么區(qū)分?什么情況下需要模擬地?cái)?shù)字地分開(kāi)?

    畫(huà)原理圖時(shí)要考慮模數(shù)地分開(kāi),怎的需要分開(kāi)模擬地與數(shù)字地..例如PWM控壓和AD采集一個(gè)電路上,AD采集元器件的值,當(dāng)值小時(shí)增大電壓,反之減小電壓,這樣是不是就要模擬地?cái)?shù)字地分開(kāi)鋪地???
    發(fā)表于 04-10 14:53

    AD9235-65什么情況下需要單端轉(zhuǎn)差分信號(hào)?

    我想用AD9235-65芯片,我的輸入信號(hào)頻率50K左右,輸入信號(hào)經(jīng)過(guò)濾波后,離AD9235的距離很近,是不是就不需要單端轉(zhuǎn)差分輸入了?我的信號(hào)本來(lái)是單端的?;蛘吒M(jìn)一步,什么情況下需要單端轉(zhuǎn)差分信號(hào)?謝謝!
    發(fā)表于 12-14 07:57

    什么情況下數(shù)據(jù)能恢復(fù)和不能恢復(fù)

    什么情況下數(shù)據(jù)能恢復(fù)和不能恢復(fù) 因數(shù)據(jù)的破壞復(fù)雜多變,數(shù)據(jù)能否恢復(fù)或幾率的大小不能一概而論。請(qǐng)查閱本站相關(guān)文章了解數(shù)
    發(fā)表于 03-29 10:42 ?2752次閱讀

    volte語(yǔ)音通話(huà)有什么用,什么情況下可以開(kāi)/關(guān)volte

    聽(tīng)很多人都在講volte高清語(yǔ)音通話(huà)那么什么是vote呢?什么情況下需要開(kāi)通volte呢?什么情況下又可以關(guān)閉volte呢?
    發(fā)表于 10-21 16:36 ?1.7w次閱讀

    什么情況下使用示波器

    示波器可以把我們看不見(jiàn)的電信號(hào)變換成看得見(jiàn)的圖像,方便來(lái)研究各種電現(xiàn)象的變化過(guò)程。那么什么情況下使用示波器呢? 使用示波器進(jìn)行測(cè)量需要涂有熒光物質(zhì)的屏面、主機(jī)、探頭配置和穩(wěn)定的信號(hào)。示波器一般都是
    的頭像 發(fā)表于 02-01 11:00 ?5550次閱讀

    什么情況下進(jìn)行電能質(zhì)量檢測(cè)?

    什么情況下進(jìn)行電能質(zhì)量檢測(cè)?
    發(fā)表于 09-08 14:20 ?630次閱讀

    什么情況下選用工業(yè)主板

    雖然工業(yè)主板和普通主板差異比較多,但是某些情況下工業(yè)主板用于商業(yè)環(huán)境也是可以的,但是實(shí)用性不是很好。什么情況下選用工業(yè)主板呢?
    的頭像 發(fā)表于 02-14 10:34 ?721次閱讀
    <b class='flag-5'>什么情況下</b>選用工業(yè)主板

    電機(jī)什么情況下需要配減速機(jī)?

    電機(jī)是運(yùn)動(dòng)機(jī)械的最常用動(dòng)力源,今天分享什么情況下電機(jī)需要配減速機(jī)。
    的頭像 發(fā)表于 05-26 17:47 ?1711次閱讀
    電機(jī)<b class='flag-5'>什么情況下</b>需要配減速機(jī)?

    應(yīng)急燈什么情況下才會(huì)亮?

    應(yīng)急燈什么情況下才會(huì)亮? 應(yīng)急燈指的是電源發(fā)生故障時(shí),正常照明無(wú)法使用的情況下,啟動(dòng)的照明燈。比如說(shuō)因?yàn)榛馂?zāi)導(dǎo)致正常照明系統(tǒng)失效時(shí),消防疏散照明燈、消防應(yīng)急照明燈會(huì)自動(dòng)亮起,起到疏散人群,提供照明
    的頭像 發(fā)表于 07-25 13:57 ?1.3w次閱讀

    什么情況下選擇熱電偶?什么情況下選擇熱電阻?哪個(gè)更合適?

    什么情況下選擇熱電偶?什么情況下選擇熱電阻?哪個(gè)更合適? 熱電偶和熱電阻都是溫度傳感器,用于測(cè)量溫度。但是它們的原理、特性和應(yīng)用場(chǎng)景不同。實(shí)際選擇中,需要根據(jù)具體情況,選擇更合適的一
    的頭像 發(fā)表于 10-26 17:47 ?1265次閱讀

    Tenacity重試模塊實(shí)踐

    如何寫(xiě)得優(yōu)雅、易用,是我們要考慮的問(wèn)題。 這里要給大家介紹的是一個(gè)第三方庫(kù) - Tenacity ,它實(shí)現(xiàn)了幾乎我們可以使用到的所有重試場(chǎng)景,比如: 什么情況下
    的頭像 發(fā)表于 11-02 11:33 ?332次閱讀

    什么情況下應(yīng)測(cè)量電動(dòng)機(jī)的絕緣電阻?

    什么情況下應(yīng)測(cè)量電動(dòng)機(jī)的絕緣電阻? 電動(dòng)機(jī)的絕緣電阻是指電機(jī)絕緣材料的絕緣性能。它是一個(gè)重要的參數(shù),用來(lái)評(píng)估電機(jī)絕緣系統(tǒng)的健康狀況和預(yù)測(cè)可能出現(xiàn)的故障。什么情況下應(yīng)該測(cè)量電動(dòng)機(jī)的絕
    的頭像 發(fā)表于 11-10 14:38 ?1418次閱讀