摘要:是一個很好用的關于重試的包,可以用來自動重試一些可能會運行失敗的程序段。就是一個可以用來應對上述問題的工具,可以在上獲得。這個設計迎合了算法,可以減輕阻塞的情況。
retrying是一個很好用的關于重試的Python包,可以用來自動重試一些可能會運行失敗的程序段。
為什么選擇retrying我們在寫一些程序的時候,會去調用一些外部資源、組件,這些外部程序對我們來說是不可控的,所以它們不可用、運行失敗都是正常的事情,尤其是在網絡上多個服務交互的時候,在寫程序的時候一定要考慮調用外部程序會失敗的情況。
retryingretrying就是一個可以用來應對上述問題的工具,可以在PyPi上獲得。
retrying提供一個裝飾器函數retry,被裝飾的函數就會在運行失敗的條件下重新執行,默認只要一直報錯就會不斷重試,看一下下面的例子:
import random from retrying import retry @retry def have_a_try(): if random.randint(0, 10) != 5: raise Exception("It"s not 5!") print "It"s 5!"
如果我們運行have_a_try函數,那么直到random.randint返回5,它才會執行結束,否則會一直重新執行。
retry還可以接受一些參數,這個從源碼中Retrying類的初始化函數可以看到可選的參數:
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。這個設計迎合了exponential backoff算法,可以減輕阻塞的情況。
我們可以指定要在出現哪些異常的時候再去retry,這個要用retry_on_exception傳入一個函數對象:
def retry_if_io_error(exception): return isinstance(exception, IOError) @retry(retry_on_exception=retry_if_io_error) def read_a_file(): with open("file", "r") as f: return f.read()
在執行read_a_file函數的過程中,如果報出異常,那么這個異常會以形參exception傳入retry_if_io_error函數中,如果exception是IOError那么就進行retry,如果不是就停止運行并拋出異常。
我們還可以指定要在得到哪些結果的時候去retry,這個要用retry_on_result傳入一個函數對象:
def retry_if_result_none(result): return result is None @retry(retry_on_result=retry_if_result_none) def get_result(): return None
在執行get_result成功后,會將函數的返回值通過形參result的形式傳入retry_if_result_none函數中,如果返回值是None那么就進行retry,否則就結束并返回函數值。
參考資料Get back up and try again: retrying in Python
retrying
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/37650.html
摘要:這篇文章的題目有點大,但這并不是說我自覺對爬蟲這塊有多大見解,我只不過是想將自己的一些經驗付諸于筆,對于如何寫一個爬蟲框架,我想一步一步地結合具體代碼來講述如何從零開始編寫一個自己的爬蟲框架年到如今,我花精力比較多的一個開源項目算是了,這是 showImg(https://segmentfault.com/img/remote/1460000018513379); 這篇文章的題目有點大...
小編寫這篇文章的主要目的,主要是給大家講解一下,關于Python機制的一些問題,比如重新調試的機制是什么呢?應用到它的場景還是很多的,下面跟小編一塊去學習吧。 介紹: 為了避免網絡問題出現的錯誤,比如網絡延遲或者是宕機,往往都會出現請求超時的問題?! ∵@里要給大家介紹的是一個第三方庫-Tenacity(標題中的重試機制并并不準確,它不是Python的內置模塊,因此并不能稱之為機制),它實現...
摘要:沒報錯但依然無法安裝使用再次安裝無果感謝大神的分享我才發覺這是一個新手的通用問題樹莓派自帶的系統附帶了一個來自前寒武紀的版本,如果您不想花費數小時來調試與相關的問題,那么就必須升級它。 諸位, 不好意思哈, 請允許我把完整的標題寫完(標題不能超過64個有效字符): 記一次解決樹莓派下載Django庫 ——報錯為TypeError: unsupported operand types f...
閱讀 1790·2021-11-24 10:21
閱讀 1202·2021-09-22 15:25
閱讀 3165·2019-08-30 15:55
閱讀 704·2019-08-30 15:54
閱讀 3456·2019-08-30 14:20
閱讀 1653·2019-08-30 14:06
閱讀 635·2019-08-30 13:11
閱讀 3135·2019-08-29 16:43