|
在日常的代碼開發(fā)過程中,重試邏輯往往扮演著比較重要的角色。 特別是在業(yè)務(wù)超時、請求阻塞等業(yè)務(wù)場景需要對某一塊邏輯加上重試機(jī)制以保持業(yè)務(wù)的連貫性。 在我們的Python編碼中就有這樣一個非常便捷的工具庫;它可以幫助我們很簡單的就能實現(xiàn)一個代碼塊中重試機(jī)制。 你可以選擇pip或者conda命令安裝這個工具庫,它就是 Tenacity 模塊。 pip install tenacity
下面我們通過一個簡單的代碼塊來演示一下它的用法。 在安裝完成之后可以直接使用注解的方式,將 @retry注解直接添加在某個函數(shù)的前面; 可以在注解中通過參數(shù)設(shè)置的方式直接設(shè)置業(yè)務(wù)邏輯重試的次數(shù)、重試間隔時間等相關(guān)信息,自動幫助我們完成重試機(jī)制; from tenacity import retry, stop_after_attempt, wait_exponential, retry_if_exception_type import requests # 用網(wǎng)絡(luò)請求模擬易失敗操作
# 1. 給函數(shù)加裝飾器,定義重試規(guī)則 @retry( stop=stop_after_attempt(3), # 最多重試3次 wait=wait_exponential(multiplier=1, min=1, max=5), # 重試間隔:1s → 2s → 4s(最多5s) retry=retry_if_exception_type(requests.exceptions.RequestException) # 只有請求異常時才重試 ) deffetch_url(url): response = requests.get(url, timeout=3) response.raise_for_status()# 觸發(fā)4xx/5xx錯誤的異常 return response.text
# 2. 調(diào)用函數(shù)(失敗會自動重試) try: result = fetch_url("https:///nonexistent")# 故意訪問不存在的地址 print("請求成功:", result[:50]) exceptExceptionas e: print(f"3次重試后仍失敗:{e}")
最后在調(diào)用這個添加了重試機(jī)制的函數(shù)時就會觸發(fā)重試機(jī)制,這種方式避免我們對每一個函數(shù)去開發(fā)復(fù)雜的重試機(jī)制。 tenacity 模塊更多的說明及用途,歡迎大家在留言討論!
|