python中可以發(fā)生異常自動重試庫retrying
1、前言
在我們?nèi)粘5拈_發(fā)工作中,為了代碼的健壯性,我們通常會對方法中的業(yè)務(wù)代碼進行try-except的包裝,以防止在發(fā)生異常的時候進程被中斷。如果發(fā)生異常,我們該怎么辦呢?有同學(xué)可能用自己的方式(循環(huán))去做了重試,那么有沒有一種通用的可靠的重試方式呢?答案是有的,它就是retrying庫,今天我們就一起來看看。
2、快速開始
retrying是一個極簡的使用Python編寫的,擁有1.8k??的可以實現(xiàn)方法異常重試的庫,我們在實際使用中直接為我們的方法增加一個@retry的裝飾器即可。
2.1、安裝retrying
pip install retrying
2.2、模擬無限重試
假設(shè)我們現(xiàn)在有一個方法demo1,這個方法中調(diào)用了另一個接口e1,但是被調(diào)用的這個e1接口不穩(wěn)定,當e1接口返回異常的時候,我們需要去重試。
from retrying import retry import time ? # 一個會返回異常的接口e1 def e1(): ? ?time.sleep(1) ? ?print('err') ? ?# 我們拋出異常模擬接口異常 ? ?raise TypeError ? # 全局計數(shù)器 a=1 @retry def demo1(n): ? ?# 方法中調(diào)用全局變量,需要global ? ?global a ? ?# 進行try-except ? ?try: ? ? ? ?print(f'開始嘗試!{a}') ? ? ? ?a+=1 ? ? ? ?e1() ? ?except Exception as e: ? ? ? ?print(e) ? ? ? ?# 當重試完成后還未成功,則返回超時 ? ? ? ?raise TimeoutError if __name__=='__main__': ? ?demo1(0)
代碼執(zhí)行結(jié)果:
你會發(fā)現(xiàn),我們代碼會一值被重試,這是為什么呢?
默認的retry裝飾器就是無限重試的,直到重試成功為止。因為我們的接口e1是永遠返回異常的,所以這個重試將會永遠持續(xù)下去。
我們改造e1方法如下,即可在重試第10次成功:
# 一個會返回異常的接口e1 def e1(): ? ?time.sleep(1) ? ?print('err') ? ?# 當重試次數(shù)達到10時,返回True ? ?if a>=10: ? ? ? ?print('ok!') ? ? ? ?return True ? ?# 我們拋出異常模擬接口異常 ? ?raise TypeError
代碼執(zhí)行結(jié)果:
開始嘗試!1
err
開始嘗試!2
err
開始嘗試!3
err
開始嘗試!4
err
開始嘗試!5
err
開始嘗試!6
err
開始嘗試!7
err
開始嘗試!8
err
開始嘗試!9
err
ok!
2.3、模擬最大重試次數(shù)
上面的無限重試明顯在實際業(yè)務(wù)場景中適用面不是非常廣,當我們需要使用重試次數(shù)來限制時,我們就可以使用retry的裝飾器參數(shù)stop_max_attempt_number
來實現(xiàn)。
# 全局計數(shù)器 a=1 @retry(stop_max_attempt_number=3) def demo1(n): ? ?# 方法中調(diào)用全局變量,需要global ? ?global a ? ?# 進行try-except ? ?try: ? ? ? ?print(f'開始嘗試!{a}') ? ? ? ?a+=1 ? ? ? ?e1() ? ?except Exception as e: ? ? ? ?print(e) ? ? ? ?# 當重試完成后還未成功,則返回超時 ? ? ? ?raise TimeoutError
以上代碼表示,我們只重試3次,如果還未成功,則返回超時異常。
代碼執(zhí)行結(jié)果:
2.4、模擬最大重試時間
除了可以使用重試次數(shù)限制外,當我們對時間要求比較明確的時候,我們就可以使用stop_max_delay
參數(shù)來指定最大重試時間。這個參數(shù)的單位是ms。
# 全局計數(shù)器 a=1 @retry(stop_max_delay=2000) def demo1(n): ? ?# 方法中調(diào)用全局變量,需要global ? ?global a ? ?# 進行try-except ? ?try: ? ? ? ?print(f'開始嘗試!{a}') ? ? ? ?a+=1 ? ? ? ?e1() ? ?except Exception as e: ? ? ? ?print(e) ? ? ? ?# 當重試完成后還未成功,則返回超時 ? ? ? ?raise TimeoutError
如上代碼表示,當重試時間超過2s就會拋出超時異常。因為在e1方法中,每次調(diào)用都會休眠1s,所以對于限制兩秒,我們只能在2s內(nèi)重試2次。
代碼執(zhí)行結(jié)果:
2.5、模擬重試間隔時間
當我們不希望重試間隔時間太長的時候,我們可以使用參數(shù)wait_fixed
指定重試的間隔時間。
# 全局計數(shù)器 a=1 @retry(stop_max_delay=6000,wait_fixed=1000) def demo1(n): ? ?# 方法中調(diào)用全局變量,需要global ? ?global a ? ?# 進行try-except ? ?try: ? ? ? ?print(f'開始嘗試!{a}') ? ? ? ?a+=1 ? ? ? ?e1() ? ?except Exception as e: ? ? ? ?print(e) ? ? ? ?# 當重試完成后還未成功,則返回超時 ? ? ? ?raise TimeoutError
如上代碼表示最大重試時間6秒,重試間隔1秒,但是e1方法中還休眠了1秒,所以在6秒內(nèi),我們理論上只能重試4次(不是3次)。
代碼運行結(jié)果:
在此基礎(chǔ)上,retrying還為我們提供了隨機的重試間隔時間參數(shù)。
- wait_random_min,重試間隔最小時間
- wait_random_max,重試間隔最大時間
一般,這兩個參數(shù)都是成對出現(xiàn),用于限制重試間隔時間的范圍。
2.6、指定重試調(diào)用的方法
retrying允許我們在重試的同時去調(diào)用一個方法。使用參數(shù)stop_func
來指定這個方法名。
# attempts, delay這兩個參數(shù)是必填的 def stop_f(attempts, delay): ? ?print('發(fā)生異常了,正在進行重試!') # 全局計數(shù)器 a=1 @retry(stop_func=stop_f,stop_max_delay=3) def demo1(n): ? ?# 方法中調(diào)用全局變量,需要global ? ?global a ? ?# 進行try-except ? ?try: ? ? ? ?print(f'開始嘗試!{a}') ? ? ? ?a+=1 ? ? ? ?e1() ? ?except Exception as e: ? ? ? ?print(e) ? ? ? ?# 當重試完成后還未成功,則返回超時 ? ? ? ?raise TimeoutError
代碼運行結(jié)果:
但是stop_func存在一個問題就是和stop_max_delay、stop_max_attempt_number結(jié)合使用的時候,后面兩者會失效。
2.7、指定重試的異常類型
當我們需要針對特定的異常才進行重試時,就需要用到這個參數(shù):retry_on_exception
。
2.8、指定重試的特定條件
當達到某個條件才會進行重試,需要使用參數(shù):retry_on_result
。
到此這篇關(guān)于python中可以發(fā)生異常自動重試庫retrying的文章就介紹到這了,更多相關(guān)python retrying內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
正確理解python中的關(guān)鍵字“with”與上下文管理器
這篇文章主要介紹了關(guān)于python中關(guān)鍵字"with"和上下文管理器的相關(guān)資料,文中介紹的非常詳細,相信對大家學(xué)習(xí)或者使用python具有一定的參考價值,需要的朋友們下面來一起看看吧。2017-04-04對numpy的array和python中自帶的list之間相互轉(zhuǎn)化詳解
下面小編就為大家分享一篇對numpy的array和python中自帶的list之間相互轉(zhuǎn)化詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-04-04使用PowerShell實現(xiàn)批量修改或替換文件名
這篇文章主要為大家介紹了基于PowerShell語言,對文件夾中全部文件的名稱加以批量替換、修改的方法,文中的示例代碼講解詳細,感興趣的可以了解一下2023-04-04Python實現(xiàn)將數(shù)據(jù)寫入netCDF4中的方法示例
這篇文章主要介紹了Python實現(xiàn)將數(shù)據(jù)寫入netCDF4中的方法,涉及Python數(shù)據(jù)處理與文件讀寫相關(guān)操作技巧,需要的朋友可以參考下2018-08-08基于Python獲取docx/doc文件內(nèi)容代碼解析
這篇文章主要介紹了基于Python獲取docx/doc文件內(nèi)容代碼解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-02-02python2與python3中關(guān)于對NaN類型數(shù)據(jù)的判斷和轉(zhuǎn)換方法
今天小編就為大家分享一篇python2與python3中關(guān)于對NaN類型數(shù)據(jù)的判斷和轉(zhuǎn)換方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-10-10