2015-08-28 198 views
4

這個問題是關於Python的請求模塊。requests.get()(Python,Requests模塊)會暫停腳本,直到響應到達?

我正在使用requests.get(),並遇到一個問題,我超出了我要聯繫的服務器請求的速率限制。我已經在每個requests.get()之後設置了一個time.sleep(),它的大小要大一個數量級。該代碼是這樣的:

 for url in url_list: 
      success = False 
      response = requests.get(url) 
      while not success: 
       time.sleep(1/250) 
       if str(response) == "<Response [200]>": 
        time.sleep(1/250) # Wait Xs between API call  
        do_stuff(response.text) 
        success = True 

       else: 
        print(response) 
        print(response.headers) 
        time.sleep(3) 
        response = requests.get(url) 

我經常在這裏跑起來我的速度是300個請求/秒,在這裏我要發送最多隻有每秒125請求。請求在響應到達之前是否暫停腳本?我不確定。我如何確保我不會發送比我的費率更多的請求?

+2

如果是python2,你正在執行'time.sleep(0)'。試試'1./250'。 – beezz

+0

您確定唯一的限制是每秒300次(即不是一些每日限制)嗎?您確定失敗的請求是由於達到該限制嗎? – BrenBarn

+0

BrenBarn這正是我想要確定的。我唯一可能遇到的其他限制是一個變量「服務器有太多的請求,所以對你有所幫助」的限制。但在發生錯誤的情況下,我等待3秒鐘,這應該是充足的時間。 所以我不確定requests.get()會暫停腳本,直到收到響應或什麼。 – CHP

回答

8

requests.get是一個阻塞調用。它會等到響應到達之後纔會執行其餘的程序。如果你希望能夠做其他事情,你可能會想看看asyncio或multiprocessing模塊。

+0

謝謝,這是我正在尋找的答案的一部分。沒有解釋爲什麼我在速度上遇到錯誤,但它不能是requests.get() – CHP

+1

您不在循環中重複request.get。所以,如果它第一次失敗,你的程序將只是永遠循環(睡在循環之間) –

+0

我是在錯誤的情況下,部分代碼莫名其妙地沒有被選中時,我複製/粘貼它。修正了它,謝謝 – CHP