retrying模組的學習

公號_python學習開發發表於2018-10-16

retrying模組的學習

我們在寫爬蟲的過程中,經常遇到爬取失敗的情況,這個時候我們一般會通過try塊去進行重試,但是每次都寫那麼一堆try塊,真的是太麻煩,所以今天就來說一個比較pythonic的模組,retrying.

安裝

retrying模組的安裝很簡單直接用匹配安裝即可。

pip install retrying
複製程式碼

使用

retring模組通過裝飾器的形式來進行重試操作的,首先我們看一個簡單的例子

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()
複製程式碼

上面的程式碼幹了哪些事呢,首先匯入retring的retry模組 然後裝飾一個run函式,然後呼叫run,函式內容很簡單就是通過raise丟擲一個異常,執行該程式碼我們發現。程式列印了五次開始重試,最後一次丟擲異常,NameError。

到這裡我們可以感受到重試了,就是這麼簡單的程式碼,就完成了五次重試,同時這五次重試的間隔時間也是不同的。 如果想嘗試10次就把上面的stop_max_attempt_number=5,改成10即可,到這裡就可以解釋retry裝飾器的引數了 stop_max_attempt_number:最大重試次數,超過這個次數會停止重試,並報異常。 wait_random_min:隨機等待最小時間。 wait_random_max:隨機等待最大時間。 好了retry的使用就是這麼簡單,在需要重試的函式上面加個裝飾器就好了。

關鍵是裝飾器裡的引數的使用,下面列舉了retrying的引數。

如果不寫引數將會一直重試.

stop_max_attempt_number:在停止之前嘗試的最大次數,最後一次如果還是有異常則會丟擲異常,停止執行,預設為5次

@retry(stop_max_attempt_number=5)
def run():
    print("開始重試")
    raise NameError

if __name__ == '__main__':
    run()
複製程式碼

強調總次數。 stop_max_delay:最大延遲時間,大概意思就是:如果呼叫的函式出現異常,那麼就會重複呼叫這個函式,最大呼叫時間,預設為100毫秒

from retrying import retry


@retry(stop_max_delay=5000)
def run():
    print("開始重試")
    raise NameError
if __name__ == '__main__':
    run()
複製程式碼

會重試5秒鐘,強調總時間。 wait_fixed:兩次呼叫方法期間停留時長, 如果出現異常則會一直重複呼叫,預設 1000毫秒

from retrying import retry
@retry(wait_fixed=2000)
def run():
    print("開始重試")
    raise NameError

if __name__ == '__main__':
    run()
複製程式碼

強調間隔時間。 wait_random_min:在兩次呼叫方法停留時長,停留最短時間,預設為0

wait_random_max:在兩次呼叫方法停留時長,停留最長時間,預設為1000毫秒

wait_incrementing_increment:每呼叫一次則會增加的時長,預設 100毫秒

wait_exponential_multiplierwait_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,則重試,否則丟擲異常退出

from 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_delaystop_max_attempt_number配合使用,則後兩者會失效

指定的stop_func會有兩個引數:attempts, delay

wait_func:和stop_func用法差不多,不多描述

相關文章