在編程的時候,我們難免會遇到一些不可靠的情況,比如網絡請求失敗,數據庫連接超時等等。這些不確定性會讓我們的程序容易出現各種錯誤和異常。那么如何來增加程序的容錯性和健壯性呢?
可能大多數人會想到使用try except來進行異常捕捉進行失敗重試(Retry)。雖然try-escept一個非常常見和有效的方式來增強程序穩定性,但是可能一不小心就會造成棧溢出。
所以接下來我就來介紹一個另外的一個專門用于失敗重試的庫:retrying。
在Python生態中,retrying庫提供了非常便捷的裝飾器和函數來幫助我們輕松添加失敗重試機制。它可以自定義重試策略、停止條件、等待間隔等,對各種異常進行捕捉處理。使用retrying可以大大減少我們重復編寫失敗重試輪詢的代碼量。
pip install retrying
我們可以直接在函數上使用裝飾器@retry來進行失敗重試
import retrying@retrydef func(): for item in range(0,100): result=item / 0 print(result) return resultfunc()
但是這種方式并不建議使用,就像上面的代碼,我們都知道0作為除數就會報錯,在上面的func函數中,因為加了@retry裝飾器進行失敗重試,這樣就就會進入一個死循環一直失敗一直重試。
所以我們在進行失敗重試的時候最好是需要加上一些參數來限制失敗重試。
(1) stop_max_attempt_number
在retry中傳入stop_max_attempt_number參數后可以指定失敗重試的次數
@retry(stop_max_attempt_number=2)def func(): print(f"記錄失敗重試") for item in range(0,100): result=item / 0 print(result) return resultfunc()
因為這里我們指定了失敗后進行兩次重試,如果重試執行兩次后還是報錯則結束重試,將錯誤信息拋出來。
(2) wait_fixed傳入wati_fixed后,可以指定重試的時間
from retrying import retryimport time# 設置三秒重試一次@retry(wait_fixed=3000) def func(): print(f"記錄失敗重試:",time.strftime("%Y-%m-%d %H:%M:%S")) result=1 / 0 print(result) return resultfunc()
配置重試間隔時間后,成語遇到執行失敗或者報錯后,就會根據設置的重試時間去進行重試執行
(3) wait_random_min和wait_random_max
通常wait_random_min和wait_random_max是一起搭配使用的,可以設置一個重試等待的時間,然后會在設置的時間區間內隨機取一個等待時間進行重試
from retrying import retryimport time@retry(wait_random_min=1000,wait_random_max=9000)def func(): print(f"記錄失敗重試:",time.strftime("%Y-%m-%d %H:%M:%S")) result=1 / 0 print(result) return resultfunc()
(4) wait_exponential_multiplier和wait_exponential_max
官方解釋為:以指數的形式產生兩次retrying之間的停留時間, 產生的值為2^previous_attempt_number * wait_exponential_multiplier, previous_attempt_number是前面已經retry的次數, 如果產生的這個值超過了wait_exponential_max的大小, 那么之后兩個retrying之間的停留值都為wait_exponential_max
通俗來點講就是每次重試的時間以wait_exponential_multiplier設置的值2,如果重試后還是失敗則繼續2,直到最后的值等于或則超過wait_exponential_max設置的值后,后面的每一次重試等待時間都是wait_exponential_max設置的值
from retrying import retryimport time@retry(wait_exponential_multiplier=1000,wait_exponential_max=10000)def func(): print(f"記錄失敗重試:",time.strftime("%Y-%m-%d %H:%M:%S")) result=1 / 0 print(result) return resultfunc()
(5)wait_func
在前面介紹的參數都是如何配置失敗沖重試的等待時間或者重試次數之類的,但是我們不能時時刻刻盯著程序,在程序代碼發生錯誤時我們應該要進行發送短信或者郵件之類的提醒才行
在這里就可以使用到wait_func參數,它接收一個可執行函數,返回一個具體的間隔時間數值,單位ms。接收的函數須接收兩個參數:attempt_number當前運行次數,delay_since_first_attempt_ms當前重試機制運行時間(單位ms)
from retrying import retryimport timedef func_demo(attempt_number,delay_since_first_attempt_ms): print("函數運行失敗后運行該函數") if attempt_number == 5: print("已經重試失敗五次了,開始準備發送提醒") if attempt_number == 10: print("已經重試失敗超10次了,發送郵件給相關人員緊急處理") if attempt_number >10: print("重試時間過長,做一些其他臨時方案進行補救") # return一個重試的時間 return 2000@retry(wait_func=func_demo)def func(): print(f"記錄失敗重試:",time.strftime("%Y-%m-%d %H:%M:%S")) result=1 / 0 return resultfunc()
使用wait_func通過調用其他可執行的函數,我們可以借助它來做一些臨時的補救措施,避免程序一直無法運行而產生的影響。
(6) 其他參數
在retry中還存在有很多參數,有興趣的小伙伴可以去詳細了解下
本文鏈接:http://www.www897cc.com/showinfo-26-27967-0.htmlPython系列:如何提高python程序代碼的健壯性
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com
上一篇: 在GORM中使用并發