2014-11-21 68 views
0

我想知道是否有一個重試請求一定的次數(這可能是因爲服務器錯誤,或網絡壞)失敗的常見模式。我想出了這個,我願意找到更好的實現。python請求:重試,直到收到有效的響應

cnt=0 
while cnt < 3: 
    try: 
     response = requests.get(uri) 
     if response.status_code == requests.codes.ok: 
      return json.loads(response.text) 
    except requests.exceptions.RequestException: 
     continue 
    cnt += 1 
return False 
+1

就是這樣:-) – 2014-11-21 13:18:02

+0

我認爲你想'傳遞'而不是'繼續'。正如所寫,'cnt'變量永遠不會增加。 – Holloway 2016-12-15 13:09:44

回答

4

您可能想考慮在重試之間引入等待,因爲很多瞬態問題可能需要幾秒鐘才能清除。另外,我建議在等待時間的幾何增長給予足夠的時間進行系統恢復:

import time 

cnt=0 
max_retry=3 
while cnt < max_retry: 
    try: 
     response = requests.get(uri) 
     if response.status_code == requests.codes.ok: 
      return json.loads(response.text) 
     else: 
      # Raise a custom exception 
    except requests.exceptions.RequestException as e: 
     time.sleep(2**cnt) 
     cnt += 1 
     if cnt >= max_retry: 
      raise e 

在這種情況下,你會重試1,2和4秒後發生。只需注意最大重試次數。您將重試次數增加到10次,接下來您知道代碼將等待17分鐘。

編輯:

以你的代碼仔細一看,它並沒有真正意義的迴歸false當你筋疲力盡重試。你應該真的提出調用者的例外,以便可以傳達問題。此外,您檢查requests.codes.ok,但沒有else動作定義。

+0

謝謝你.....! – yayu 2014-11-21 14:14:43

+0

我同意幾何重試。但也建議在延遲時間內添加隨機抖動(例如,高達500毫秒),以便同時發出多個併發請求的可能性較小。應在每次重試時計算每個毫秒的隨機數。 – 2015-09-03 12:45:58

相關問題