一文詳解Python中的重試機制
介紹
為了避免由于一些網(wǎng)絡或等其他不可控因素,而引起的功能性問題。比如在發(fā)送請求時,會因為網(wǎng)絡不穩(wěn)定,往往會有請求超時的問題。
這種情況下,我們通常會在代碼中加入重試的代碼。重試的代碼本身不難實現(xiàn),但如何寫得優(yōu)雅、易用,是我們要考慮的問題。
這里要給大家介紹的是一個第三方庫 - Tenacity (標題中的重試機制并并不準確,它不是 Python 的內置模塊,因此并不能稱之為機制),它實現(xiàn)了幾乎我們可以使用到的所有重試場景,喜歡記得收藏、關注、點贊。
比如:
在什么情況下才進行重試?
重試幾次呢?
重試多久后結束?
每次重試的間隔多長呢?
重試失敗后的回調?
在使用它之前 ,先要安裝它
$ pip install tenacity
1. 最基本的重試
無條件重試,重試之間無間隔
from tenacity import retry
@retry
def test_retry():
print("等待重試,重試無間隔執(zhí)行...")
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. 設置何時進行重試
在出現(xià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()
在滿足自定義條件時,再進行重試。
如下示例,當 test_retry 函數(shù)返回值為 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. 重試后錯誤重新拋出
當出現(xiàn)異常后,tenacity 會進行重試,若重試后還是失敗,默認情況下,往上拋出的異常會變成 RetryError,而不是最根本的原因。
因此可以加一個參數(shù)(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. 設置回調函數(shù)
當最后一次重試失敗后,可以執(zhí)行一個回調函數(shù)
from tenacity import *
def return_last_value(retry_state):
print("執(zhí)行回調函數(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í)行回調函數(shù)
False
到此這篇關于一文詳解Python中的重試機制的文章就介紹到這了,更多相關Python重試機制內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Python機器學習NLP自然語言處理基本操作之Seq2seq的用法
Seq2Seq模型是輸出的長度不確定時采用的模型,這種情況一般是在機器翻譯的任務中出現(xiàn),將一句中文翻譯成英文,那么這句英文的長度有可能會比中文短,也有可能會比中文長,所以輸出的長度就不確定了2021-10-10
Python matplotlib畫圖與中文設置操作實例分析
這篇文章主要介紹了Python matplotlib畫圖與中文設置操作,結合實例形式分析了Python使用matplotlib進行圖形繪制及中文設置相關操作技巧,需要的朋友可以參考下2019-04-04
Linux上安裝Python的PIL和Pillow庫處理圖片的實例教程
這里我們來看一下在Linux上安裝Python的PIL和Pillow庫處理圖片的實例教程,包括一個使用Pillow庫實現(xiàn)批量轉換圖片的例子:2016-06-06
python實現(xiàn)發(fā)送和獲取手機短信驗證碼
這篇文章主要介紹了python實現(xiàn)發(fā)送和獲取手機短信驗證碼的相關資料,講解了python如何解決接口測試獲取手機驗證碼問題,感興趣的小伙伴們可以參考一下2016-01-01
Python3內置模塊pprint讓打印比print更美觀詳解
這篇文章主要給大家介紹了關于Python3內置模塊pprint讓打印比print更美觀的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用Python3具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧2019-06-06

