python的retrying模塊
簡介
有點類似我們前面學習過的retry模塊,功能都很相似
安裝
API 介紹
def __init__(self,
stop=None, wait=None,
stop_max_attempt_number=None,
stop_max_delay=None,
wait_fixed=None,
wait_random_min=None, wait_random_max=None,
wait_incrementing_start=None, wait_incrementing_increment=None,
wait_exponential_multiplier=None, wait_exponential_max=None,
retry_on_exception=None,
retry_on_result=None,
wrap_exception=False,
stop_func=None,
wait_func=None,
wait_jitter_max=None)
- stop_max_attempt_number:用來設定最大的嘗試次數,超過該次數就停止重試
- stop_max_delay:比如設置成10000,那么從被裝飾的函數開始執行的時間點開始,到函數成功運行結束或者失敗報錯中止的時間點,只要這段時間超過10秒,函數就不會再執行了
- wait_fixed:設置在兩次retrying之間的停留時間
- wait_random_min和wait_random_max:用隨機的方式產生兩次retrying之間的停留時間
- 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,這個要用retry_on_exception傳入一個函數對象
列子:
@retry
def never_give_up_never_surrender():
print "Retry forever ignoring Exceptions, don't wait between retries"
- stop_max_attempt_number 設置最大重試次數
@retry(stop_max_attempt_number=7)
def stop_after_7_attempts():
print "Stopping after 7 attempts"
raise
- stop_max_delay 設置失敗重試的最大時間, 單位毫秒,超出時間,則停止重試
@retry(stop_max_delay=10000)
def stop_after_10_s():
print "Stopping after 10 seconds"
raise
@retry(wait_fixed=2000, stop_max_delay=10000)
def wait_2_s():
print "Wait 2 second between retries"
raise
- wait_random_min, wait_random_max 設置失敗重試隨機性間隔時間
@retry(wait_random_min=1000, wait_random_max=5000, stop_max_delay=10000)
def wait_random_1_to_5_s():
print "Randomly wait 1 to 5 seconds between retries"
raise
- wait_exponential_multiplier-間隔時間倍數增加,wait_exponential_max-最大間隔時間
import time
@retry(wait_exponential_multiplier=1000, wait_exponential_max=10000)
def wait_exponential_1000():
print "Wait 2^x * 1000 milliseconds between each retry, up to 10 seconds, then 10 seconds afterwards"
print int(time.time())
raise
輸出:
Wait 2^x * 1000 milliseconds between each retry, up to 10 seconds, then 10 seconds afterwards
1504110314
Wait 2^x * 1000 milliseconds between each retry, up to 10 seconds, then 10 seconds afterwards
1504110316
Wait 2^x * 1000 milliseconds between each retry, up to 10 seconds, then 10 seconds afterwards
1504110320
Wait 2^x * 1000 milliseconds between each retry, up to 10 seconds, then 10 seconds afterwards
1504110328
Wait 2^x * 1000 milliseconds between each retry, up to 10 seconds, then 10 seconds afterwards
1504110338
Wait 2^x * 1000 milliseconds between each retry, up to 10 seconds, then 10 seconds afterwards
1504110348
- retry_on_exception指定異常類型,指定的異常類型會重試,不指定的類型,會直接異常退出,wrap_exception參數設置為True,則其他類型異常,或包裹在RetryError中,會看到RetryError和程序拋的Exception error
def retry_if_io_error(exception):
"""Return True if we should retry (in this case when it's an IOError), False otherwise"""
return isinstance(exception, IOError)
@retry(retry_on_exception=retry_if_io_error)
def might_io_error():
print "Retry forever with no wait if an IOError occurs, raise any other errors"
raise Exception('a')
@retry(retry_on_exception=retry_if_io_error, wrap_exception=True)
def only_raise_retry_error_when_not_io_error():
print "Retry forever with no wait if an IOError occurs, raise any other errors wrapped in RetryError"
raise Exception('a')
- retry_on_result, 指定要在得到哪些結果的時候去retry,retry_on_result傳入一個函數對象,在執行get_result成功后,會將函數的返回值通過形參result的形式傳入retry_if_result_none函數中,如果返回值是None那么就進行retry,否則就結束並返回函數值
def retry_if_result_none(result):
return result is None
@retry(retry_on_result=retry_if_result_none)
def get_result():
print 'Retry forever ignoring Exceptions with no wait if return value is None'
return None
https://blog.csdn.net/Ricky110/article/details/77727858