<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
為了避免由於一些網路或等其他不可控因素,而引起的功能性問題。比如在傳送請求時,會因為網路不穩定,往往會有請求超時的問題。
這種情況下,我們通常會在程式碼中加入重試的程式碼。重試的程式碼本身不難實現,但如何寫得優雅、易用,是我們要考慮的問題。
這裡要給大家介紹的是一個第三方庫 - Tenacity (標題中的重試機制並並不準確,它不是 Python 的內建模組,因此並不能稱之為機制),它實現了幾乎我們可以使用到的所有重試場景,喜歡記得收藏、關注、點贊。
比如:
在什麼情況下才進行重試?
重試幾次呢?
重試多久後結束?
每次重試的間隔多長呢?
重試失敗後的回撥?
在使用它之前 ,先要安裝它
$ pip install tenacity
無條件重試,重試之間無間隔
from tenacity import retry @retry def test_retry(): print("等待重試,重試無間隔執行...") raise Exception test_retry()
無條件重試,但是在重試之前要等待 2 秒
from tenacity import retry, wait_fixed @retry(wait=wait_fixed(2)) def test_retry(): print("等待重試...") raise Exception test_retry()
只重試7 次
from tenacity import retry, stop_after_attempt @retry(stop=stop_after_attempt(7)) def test_retry(): print("等待重試...") raise Exception test_retry()
重試 10 秒後不再重試
from tenacity import retry, stop_after_delay @retry(stop=stop_after_delay(10)) def test_retry(): print("等待重試...") raise Exception test_retry()
或者上面兩個條件滿足一個就結束重試
from tenacity import retry, stop_after_delay, stop_after_attempt @retry(stop=(stop_after_delay(10) | stop_after_attempt(7))) def test_retry(): print("等待重試...") raise Exception test_retry()
在出現特定錯誤/異常(比如請求超時)的情況下,再進行重試
from requests import exceptions from tenacity import retry, retry_if_exception_type @retry(retry=retry_if_exception_type(exceptions.Timeout)) def test_retry(): print("等待重試...") raise exceptions.Timeout test_retry()
在滿足自定義條件時,再進行重試。
如下範例,當 test_retry 函數返回值為 False 時,再進行重試
from tenacity import retry, stop_after_attempt, retry_if_result def is_false(value): return value is False @retry(stop=stop_after_attempt(3), retry=retry_if_result(is_false)) def test_retry(): return False test_retry()
當出現異常後,tenacity 會進行重試,若重試後還是失敗,預設情況下,往上丟擲的異常會變成 RetryError,而不是最根本的原因。
因此可以加一個引數(reraise=True),使得當重試失敗後,往外丟擲的異常還是原來的那個。
from tenacity import retry, stop_after_attempt @retry(stop=stop_after_attempt(7), reraise=True) def test_retry(): print("等待重試...") raise Exception test_retry()
當最後一次重試失敗後,可以執行一個回撥函數
from tenacity import * def return_last_value(retry_state): print("執行回撥函數") return retry_state.outcome.result() # 表示返回原函數的返回值 def is_false(value): return value is False @retry(stop=stop_after_attempt(3), retry_error_callback=return_last_value, retry=retry_if_result(is_false)) def test_retry(): print("等待重試中...") return False print(test_retry())
輸出如下
等待重試中...
等待重試中...
等待重試中...
執行回撥函數
False
到此這篇關於一文詳解Python中的重試機制的文章就介紹到這了,更多相關Python重試機制內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45