python的retrying模塊


python的retrying模塊

簡介

有點類似我們前面學習過的retry模塊,功能都很相似

安裝

  • pip install retrying

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裝飾器,如出現異常會一直重試
@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
  • wait_fixed 設置失敗重試的間隔時間
@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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM