retrying模塊的使用

安裝模塊:pip3 install retrying

 

使用方式:

  1. 使用retrying模塊提供的retry模塊
  2. 通過裝飾器的方式使用,讓裝飾器的函數反覆的執行
  3. 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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章