安裝模塊:pip3 install retrying
使用方式:
- 使用retrying模塊提供的retry模塊
- 通過裝飾器的方式使用,讓裝飾器的函數反覆的執行
- retry可以傳入參數stop_max_attempt_number,讓函數報錯後繼續重新執行,達到最大執行次數的上線,如果每次都報錯,整個函數就報錯,只要中間有一個成功了的話,程序就可以繼續往後面執行了
例子:
from retrying import retry @retry(stop_max_attempt_number=5,wait_random_min=1000,wait_random_max=5000) def run(): print("開始重試") raise NameError if __name__ == '__main__': run()
首先導入了retry模塊
然後裝飾了一個run函數,函數中很簡單,主要就是通過raise跑出了一個異常,執行這個代碼 我們可以發現,程序打印了五次開始重試,最後一次拋出異常,NameError,那麼到了這裏我們就可以感受到,就是這麼簡單的代碼,就完成了五次重試,同時這五次重試的間隔時間也是不同的,要是想嘗試重複十次以上的的話,就需要把上面的stop_max_attempt_number改成10就可以了,到這裏就可以解釋retry裝飾器的參數了
retry的使用就是這麼簡單,關鍵是裝飾器裏面的參數的使用,要是不寫參數的話就會一直一種重試
stop_max_attempt_number
在停止之前嘗試的最大次數,最後一次如果還是有異常就會拋出異常,停止運行,默認是五次(強調總次數)
stop_max_delay
最大延遲時間,大概的意思就是:如果調用的函數拋出異常了,那麼就會重複調用這個函數,最大調用時間,默認100毫秒
wait_random_min
在兩次調用方法停留時長,停留最短的時間,默認是0
wait_random_max
在兩次調用方法停留時長,停留最長時間,默認是1000毫秒
wait_incrementing_increment
每調用一次就會增加的時長,默認是100毫秒
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
retry_on_exception
指定一個函數,如果這個函數返回指定異常,就會重試,如果不是指定的異常就會推出
from retrying import retry def run2(exception): return isinstance(exception, ZeroDivisionError) @retry(retry_on_exception=run2) def run(): print("開始重試") a = 1 / 0 if __name__ == '__main__': run()
retry_on_result
指定一個函數,如果指定的函數返回True,就重試,否則拋出異常退出
rom retrying import retry def run2(r): return isinstance(r, int) @retry(retry_on_result=run2) def run(): print("開始重試") a = 1 return a if __name__ == '__main__': run()
wrap_exception
參數設置爲True/False,如果指定的異常類型,包裹在retryError中,就會看到RetryError和程序拋出的Exception error
stop_func
每次拋出異常的時候都會執行的函數,如果stop_max_delay、stop_max_attmpt_number配合使用,則後兩個就會失效,指定的stop_func會有兩個參數:attempt、delay
wait_func
和stop_func的用法差不多,就不過多的描述了
ps:如果沒有捕獲到異常,就會從該層外層的異常重試觸發;嘗試兩次失敗會報錯,所以在再次使用處理,跳出報錯,直接pass