小編寫這篇文章的主要目的,主要是給大家講解一下,關于Python機制的一些問題,比如重新調試的機制是什么呢?應用到它的場景還是很多的,下面跟小編一塊去學習吧。
介紹:
為了避免網絡問題出現的錯誤,比如網絡延遲或者是宕機,往往都會出現請求超時的問題。
這里要給大家介紹的是一個第三方庫-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
至此,小編就為大家介紹到這里了,希望可以給各位讀者帶來幫助。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/127998.html
小編寫這篇文字的一個主要目的,主要是給大家解答關于python的一些相關事宜,主要涉及到內容是如何利用其python獲取返回值,那么,返回值的三種方式分別是什么呢?具體的內容,下面就給大家詳細的做出解答。 提到線程,你的大腦應該有這樣的印象:我們可以控制它何時開始,卻無法控制它何時結束,那么如何獲取線程的返回值呢?今天就分享一下自己的一些做法。 方法一 使用全局變量的列表,來保存返回值 ...
小編寫這篇文章的一個主要目的,主要是來給大家做個介紹,介紹的內容主要是涉及到Python一些試題的講解,小編給大家總結出來了五道必考的題目,大家可要仔細閱讀哦,下面就給大家詳細解答。 1、使用while循環實現輸出2-3+4-5+6...+100的和 #方法一 #從2開始計算 i=2 #定義一個變量用于保存結果 sum=0 whilei<=100: i...
小編寫這篇文章的主要目的,主要是給大家介紹關于Python numpy和matlab區別的介紹,具體區別,下文給大家詳細的解答。 numpy和matlab的幾點差異 Python numpy和matlab都是便捷靈活的科學計算語言,兩者具有很多相似之處,但也有一些混淆的地方,這里假定你熟悉matlab,但不了解numpy,記錄幾個numpy實例: 1、Numpy數組索引指定開始和結束時 ...
小編寫這篇文章的主要目的,主要是給大家來做一個解答,解答的內容是關于Python代碼的事宜,將會教給大家如何使用Python去引用相關的模塊,那么,具體的引用方法是什么呢?有什么技巧可言呢?下面就給大家詳細解答下。 平時寫的一些Python的代碼,需要在其他模塊里面復用。最粗狂的方法就是直接copy過去。 但這種方式太麻煩,copy一堆代碼,導致代碼量也很多。copy的也不爽。 下面就介...
Python pygame作為一門常見的技能,其實,它的應用范圍還是比較的廣泛的,那么,它是怎么實現其拼圖游戲呢?下面就以案例的形式,去給大家做個解答,下面就給大家詳細解答下。 pygame介紹 Python Pygame是一款專門為開發和設計2D電子游戲而生的軟件包,它支Windows、Linux、Mac OS等操作系統,具有良好的跨平臺性。Pygame由Pete Shinners于20...
閱讀 911·2023-01-14 11:38
閱讀 878·2023-01-14 11:04
閱讀 740·2023-01-14 10:48
閱讀 1982·2023-01-14 10:34
閱讀 942·2023-01-14 10:24
閱讀 819·2023-01-14 10:18
閱讀 499·2023-01-14 10:09
閱讀 572·2023-01-14 10:02