tenacity
的錯誤重試核心功能是由其retry
裝飾器來實現的
默認retry
不給參數時,將會不停地重試下去, 這也不符合需求的.
retry(stop=stop_after_attempt(3))
將在嘗試3次後,於第4次拋出異常.
retry(stop=stop_after_delay(5))
,整個重試的超時時長超於5秒, 將停止重試.
retry(stop=(stop_after_delay(5) | stop_after_attempt(3)))
將在重試總時長超過5秒後, 或者 重試3次後, 停止重試
有兩種方式:
retry(wait=wait_fixed(1), stop=stop_after_attempt(3))
重試3次, 每次重試間隔1秒
retry(wait=wait_random(min=1, max=3), stop=stop_after_attempt(3))
重試3次, 每次重試間隔1到3秒
# 捕捉錯誤類型
retry(retry=retry_if_exception_type(FileExistsError))
# 忽略錯誤類型
retry(retry=retry_if_not_exception_type(FileNotFoundError))
若是FileExistsError,則重試
若是FileNotFoundError,則不用重試.
retry(retry=retry_if_result(lambda x: x>1))
若函數體的返回結果大於1, 則重試
print(fun_name.retry.statistics)
可以打印fun_name的重試統計情況
from tenacity import retry, stop_after_attempt, stop_after_delay
import random
# 設置重試次數
@retry(stop=stop_after_attempt(3))
def fun_name1():
print("函數體內執行")
raise Exception
# 設置重試總超時時長
import time
@retry(stop=stop_after_delay(2))
def fun_name2():
print("函數體內執行")
time.sleep(1)
print(time.time())
raise Exception
# 組合重試停止條件
@retry(stop=(stop_after_delay(3) | stop_after_attempt(10) ))
def fun_name3():
print("函數體內執行")
time.sleep(random.random())
print(time.time())
raise Exception
# 設置相鄰重試間隔為固定時間間隔
from tenacity import wait_fixed, wait_random
@retry(wait=wait_fixed(1), stop=stop_after_delay(5))
def fun_name4():
print("函數體內執行")
print(time.time())
raise Exception
# 設置相鄰重試間隔 隨機時間間隔
@retry(wait=wait_random(min=1,max=3), stop=stop_after_delay(5))
def fun_name5():
print("函數體內執行")
print(time.time())
raise Exception
fun_name5()
fun_name4()
fun_name3()
fun_name2()