為了避免由于一些網絡或等其他不可控因素,而引起的功能性問題。比如在發送請求時,會因為網絡不穩定,往往會有請求超時的問題。
這種情況下,我們通常會在代碼中加入重試的代碼。重試的代碼本身不難實現,但如何寫得優雅、易用,是我們要考慮的問題。
這里要給大家介紹的是一個第三方庫 - Tenacity (標題中的重試機制并并不準確,它不是 Python 的內置模塊,因此并不能稱之為機制),它實現了幾乎我們可以使用到的所有重試場景,比如:
- 在什么情況下才進行重試?
- 重試幾次呢?
- 重試多久后結束?
- 每次重試的間隔多長呢?
- 重試失敗后的回調?
在使用它之前 ,先要安裝它
$ pip install tenacity
1. 最基本的重試
無條件重試,重試之間無間隔
from tenacity import retry
@retry
def test_retry():
print("等待重試,重試無間隔執行...")
raise Exception
test_retry()
無條件重試,但是在重試之前要等待 2 秒
from tenacity import retry, wait_fixed
@retry(wait=wait_fixed(2))
def test_retry():
print("等待重試...")
raise Exception
test_retry()
2. 設置停止基本條件
只重試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()
或者上面兩個條件滿足一個就結束重試
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. 設置何時進行重試
在出現特定錯誤/異常(比如請求超時)的情況下,再進行重試
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()
在滿足自定義條件時,再進行重試。
如下示例,當 test_retry 函數返回值為 False 時,再進行重試
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. 重試后錯誤重新拋出
當出現異常后,tenacity 會進行重試,若重試后還是失敗,默認情況下,往上拋出的異常會變成 RetryError,而不是最根本的原因。
因此可以加一個參數(reraise=True),使得當重試失敗后,往外拋出的異常還是原來的那個。
from tenacity import retry, stop_after_attempt
@retry(stop=stop_after_attempt(7), reraise=True)
def test_retry():
print("等待重試...")
raise Exception
test_retry()
5. 設置回調函數
當最后一次重試失敗后,可以執行一個回調函數
from tenacity import *
def return_last_value(retry_state):
print("執行回調函數")
return retry_state.outcome.result() # 表示返回原函數的返回值
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())
輸出如下
等待重試中...
等待重試中...
等待重試中...
執行回調函數
False
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
模塊
+關注
關注
7文章
2837瀏覽量
53283 -
函數
+關注
關注
3文章
4417瀏覽量
67501 -
代碼
+關注
關注
30文章
4968瀏覽量
73960 -
python
+關注
關注
57文章
4876瀏覽量
90025
發布評論請先 登錄
相關推薦
熱點推薦
請問在什么情況下才需要使用通信協議
最近有個客戶要做一個串口通信控制LED燈的板子當時它問我要用什么通信協議;我門在學習串口通信時并沒有學到什么通信協議把?在網上查了是有一些; 請問:在什么情況下才需要使用通信協議
發表于 06-13 04:35
AD9235-65在什么情況下才需要單端轉差分信號?
我想用AD9235-65芯片,我的輸入信號頻率50K左右,輸入信號經過濾波后,離AD9235的距離很近,是不是就不需要單端轉差分輸入了?我的信號本來是單端的。或者更進一步,在什么情況下才需要單端轉差分信號?謝謝!
發表于 12-14 07:57
volte語音通話有什么用,什么情況下可以開/關volte
聽很多人都在講volte高清語音通話那么什么是vote呢?什么情況下需要開通volte呢?什么情況下又可以關閉volte呢?
發表于 10-21 16:36
?1.9w次閱讀
什么情況下使用示波器
示波器可以把我們看不見的電信號變換成看得見的圖像,方便來研究各種電現象的變化過程。那么什么情況下使用示波器呢? 使用示波器進行測量需要涂有熒光物質的屏面、主機、探頭配置和穩定的信號。示波器一般都是
應急燈什么情況下才會亮?
應急燈什么情況下才會亮? 應急燈指的是電源發生故障時,正常照明無法使用的情況下,啟動的照明燈。比如說因為火災導致正常照明系統失效時,消防疏散照明燈、消防應急照明燈會自動亮起,起到疏散人群,提供照明
什么情況下選擇熱電偶?什么情況下選擇熱電阻?哪個更合適?
什么情況下選擇熱電偶?什么情況下選擇熱電阻?哪個更合適? 熱電偶和熱電阻都是溫度傳感器,用于測量溫度。但是它們的原理、特性和應用場景不同。在實際選擇中,需要根據具體情況,選擇更合適的一
Tenacity重試模塊實踐
如何寫得優雅、易用,是我們要考慮的問題。 這里要給大家介紹的是一個第三方庫 - Tenacity ,它實現了幾乎我們可以使用到的所有重試場景,比如: 在什么情況下才
在什么情況下應測量電動機的絕緣電阻?
在什么情況下應測量電動機的絕緣電阻? 電動機的絕緣電阻是指電機絕緣材料的絕緣性能。它是一個重要的參數,用來評估電機絕緣系統的健康狀況和預測可能出現的故障。在什么情況下應該測量電動機的絕
什么情況下電容器會被擊穿
電容器是一種常見的電子元件,廣泛應用于各個領域。然而,在特定條件下,電容器可能會發生擊穿現象,導致其無法正常工作甚至損壞。那么,在什么情況下電容器會被擊穿呢?
Python 在什么情況下才進行重試
評論