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


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

參數(shù):

  • stop_max_attempt_number:用來設(shè)定最大的嘗試次數(shù)役耕,超過該次數(shù)就會停止

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

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

  • retry_on_exception:指定出現(xiàn)哪些異常的時候再去retry 例:* retry_on_exception(retry_if_io_error)

  • retry_on_result:指定要在得到哪些結(jié)果再去retry
    retrying是一個python的重試包惯悠,可以用來自動重試一些可能運行失敗的程序段,retrying提供一個裝飾器函數(shù)retry,被裝飾的函數(shù)就會在運行失敗的情況下重新執(zhí)行娶视,默認(rèn)只要一直報錯就會不斷重試柒傻。

  • stop_max_attempt_number:用來設(shè)定最大的嘗試次數(shù)青柄,超過該次數(shù)就會停止

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

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

  • retry_on_exception:指定出現(xiàn)哪些異常的時候再去retry
    例:retry_on_exception(retry_if_io_error)

  • retry_on_result:指定要在得到哪些結(jié)果再去retry
    例:retry_on_result(retry_if_result_none)

功能:

  • 一般裝飾器api
  • 特定的停止條件(限制嘗試次數(shù))
  • 特定的等待條件(每次嘗試之間的指數(shù)增長的時間等待)
  • 自定義的異常進(jìn)行嘗試
  • 自定義的異常進(jìn)行嘗試返回結(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ù)和其他遠(yuǎn)程端點時,很難擊敗指數(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閱讀 216,919評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異芥玉,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,567評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事搔扁∑市В” “怎么了?”我有些...
    開封第一講書人閱讀 163,316評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么崇堵? 我笑而不...
    開封第一講書人閱讀 58,294評論 1 292
  • 正文 為了忘掉前任摸柄,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘庐舟。我一直安慰自己瘟檩,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,318評論 6 390
  • 文/花漫 我一把揭開白布缚柳。 她就那樣靜靜地躺著堵幽,像睡著了一般刽肠。 火紅的嫁衣襯著肌膚如雪厨钻。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,245評論 1 299
  • 那天,我揣著相機與錄音惭蟋,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛我碟,可吹牛的內(nèi)容都是我干的姚建。 我是一名探鬼主播掸冤,決...
    沈念sama閱讀 40,120評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起沐兰,我...
    開封第一講書人閱讀 38,964評論 0 275
  • 序言:老撾萬榮一對情侶失蹤嫩海,失蹤者是張志新(化名)和其女友劉穎冬殃,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體叁怪,經(jīng)...
    沈念sama閱讀 45,376評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡审葬,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,592評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了奕谭。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片涣觉。...
    茶點故事閱讀 39,764評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖展箱,靈堂內(nèi)的尸體忽然破棺而出旨枯,到底是詐尸還是另有隱情,我是刑警寧澤混驰,帶...
    沈念sama閱讀 35,460評論 5 344
  • 正文 年R本政府宣布攀隔,位于F島的核電站皂贩,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏昆汹。R本人自食惡果不足惜明刷,卻給世界環(huán)境...
    茶點故事閱讀 41,070評論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望满粗。 院中可真熱鬧辈末,春花似錦、人聲如沸映皆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,697評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽捅彻。三九已至组去,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間步淹,已是汗流浹背从隆。 一陣腳步聲響...
    開封第一講書人閱讀 32,846評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留缭裆,地道東北人键闺。 一個月前我還...
    沈念sama閱讀 47,819評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像澈驼,于是被迫代替她去往敵國和親辛燥。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,665評論 2 354

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理盅藻,服務(wù)發(fā)現(xiàn)购桑,斷路器,智...
    卡卡羅2017閱讀 134,654評論 18 139
  • retrying是一個很好用的關(guān)于重試的Python包氏淑,可以用來自動重試一些可能會運行失敗的程序段勃蜘。 為什么選擇r...
    z_clown閱讀 1,129評論 1 0
  • 這個地方就是神門穴。神門穴眶俩,顧名思義莹汤,是安定心神的門戶。神門穴位于人體腕部颠印,腕掌側(cè)橫紋尺側(cè)端纲岭,尺側(cè)腕屈肌腱的橈側(cè)凹...
    逍遙an閱讀 362評論 0 0
  • Write a function called digit_sum that takes a positive ...
    吳黃龍本人閱讀 987評論 1 0