python的retrying庫處理嘗試多次請求

retrying是一個python的重試包芝硬,可以用來自動重試一些可能運行失敗的程序段蚜点,retrying提供一個裝飾器函數(shù)retry,被裝飾的函數(shù)就會在運行失敗的情況下重新執(zhí)行拌阴,默認(rèn)只要一直報錯就會不斷重試绍绘。

安裝

  • 簡單的安裝retrying:

pip install retrying

參數(shù):

  • stop_max_attempt_number:在停止之前嘗試的最大次數(shù),最后一次如果還是有異常則會拋出異常迟赃,停止運行陪拘,默認(rèn)為5次

  • stop_max_delay:從被裝飾的函數(shù)開始執(zhí)行的時間點開始到函數(shù)成功運行結(jié)束或失敗報錯中止的時間點。單位:毫秒

  • wait_random_min:在兩次調(diào)用方法停留時長纤壁,停留最短時間左刽,默認(rèn)為0,單位毫秒

  • wait_random_max:在兩次調(diào)用方法停留時長,停留最長時間酌媒,默認(rèn)為1000毫秒

  • wait_fixed:設(shè)置在兩次retrying之間的停留時間

  • retry_on_exception:指定一個函數(shù)欠痴,如果此函數(shù)返回指定異常,則會重試秒咨,如果不是指定的異常則會退出
    例:* retry_on_exception(retry_if_io_error)

  • retry_on_result:指定一個函數(shù)喇辽,如果指定的函數(shù)返回True,則重試拭荤,否則拋出異常退出

功能:

一般裝飾器api
特定的停止條件(限制嘗試次數(shù))
特定的等待條件(每次嘗試之間的指數(shù)增長的時間等待)
自定義的異常進行嘗試
自定義的異常進行嘗試返回結(jié)果
最簡單的一個使用方法是無論有任何異常出現(xiàn)茵臭,都會一直重新調(diào)用一個函數(shù)、方法舅世,直到返回一個值

import random
from retrying import retry

@retry
def do_something_unreliable():
    if random.randint(0, 10) > 1:
        print "just have a test"
        raise IOError("Broken sauce, everything is hosed!!!111one")
    else:
        return "Awesome sauce!"

print do_something_unreliable()

運行該段代碼旦委,你會發(fā)現(xiàn)每次隨機打印的“just have a test”這句話次數(shù)不一致
例子
正如你上邊看到的例子,默認(rèn)的行為會一直重試雏亚,沒有時間等待

@retry
def never_give_up_never_surrender():
    print "Retry forever ignoring Exceptions, don't wait between retries"

騷年缨硝,不要太固執(zhí),加點限制罢低,放棄之前查辩,嘗試幾次(代碼嘗試幾次后停止)

@retry(stop_max_attempt_number=7)
def stop_after_7_attempts():
    print "Stopping after 7 attempts"

我們沒有太多的時間,所以在每個嘗試需要加個時間限制(多少s后停止嘗試)

@retry(stop_max_delay=10000)
def stop_after_10_s():
    print "Stopping after 10 seconds"

大多數(shù)事情并不是需要盡可能快的執(zhí)行网持,所以加一些時間等待(每個嘗試間加固定時間等待)

@retry(wait_fixed=2000)
def wait_2_s():
    print "Wait 2 second between retries"

一些最好是隨機的時間等待(每個嘗試隨機時間等待)

@retry(wait_random_min=1000, wait_random_max=2000)
def wait_random_1_to_2_s():
    print "Randomly wait 1 to 2 seconds between retries"

再一次宜岛,在重新嘗試分布式服務(wù)和其他遠程端點時,很難擊敗指數(shù)級回退(不會翻譯功舀,大概就是每次嘗試的等待時間以指數(shù)形式增長)

@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"

我們有一些處理重新嘗試的選項萍倡,它們會引起特定的或一般的異常,就像這里的情況一樣(根據(jù)異常重試)

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"

@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 

我們也可以使用函數(shù)的結(jié)果來改變重新嘗試的行為

def retry_if_result_none(result):
    """Return True if we should retry (in this case when result is None), False otherwise"""
    return result is None

@retry(retry_on_result=retry_if_result_none)
def might_return_none():
    print "Retry forever ignoring Exceptions with no wait if return value is None"

任何停止辟汰、等待等的組合也會被支持列敲,使你可以自由地混合和匹配阱佛。騷男,嘗試起來吧戴而!


原文:https://pypi.org/project/retrying/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末凑术,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子所意,更是在濱河造成了極大的恐慌淮逊,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件扁眯,死亡現(xiàn)場離奇詭異壮莹,居然都是意外死亡,警方通過查閱死者的電腦和手機姻檀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進店門命满,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人绣版,你說我怎么就攤上這事胶台。” “怎么了杂抽?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵诈唬,是天一觀的道長。 經(jīng)常有香客問我缩麸,道長铸磅,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任杭朱,我火速辦了婚禮阅仔,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘弧械。我一直安慰自己八酒,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布刃唐。 她就那樣靜靜地躺著羞迷,像睡著了一般。 火紅的嫁衣襯著肌膚如雪画饥。 梳的紋絲不亂的頭發(fā)上衔瓮,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天,我揣著相機與錄音抖甘,去河邊找鬼热鞍。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的碍现。 我是一名探鬼主播,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼米奸,長吁一口氣:“原來是場噩夢啊……” “哼昼接!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起悴晰,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤慢睡,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后铡溪,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體漂辐,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年棕硫,在試婚紗的時候發(fā)現(xiàn)自己被綠了髓涯。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡哈扮,死狀恐怖纬纪,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情滑肉,我是刑警寧澤包各,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站靶庙,受9級特大地震影響问畅,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜六荒,卻給世界環(huán)境...
    茶點故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一护姆、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧恬吕,春花似錦签则、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至钠惩,卻和暖如春柒凉,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背篓跛。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工膝捞, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人愧沟。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓蔬咬,卻偏偏與公主長得像鲤遥,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子林艘,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,724評論 2 354