2008-11-05 300 views
2

在Python 2.6,一個新的「超時」參數被添加到httplib.HTTPConnection類: http://docs.python.org/library/httplib.html#httplib.HTTPConnectionHTTP請求超時

然而,這僅僅是用於連接到服務器的超時。我期待爲請求設置超時值,而不是連接。這似乎沒有被httplib支持。

有什麼辦法可以模擬這種行爲嗎?

+0

相關:[讀取超時使用urllib2或任何其他http庫](http://stackoverflow.com/q/9548869/4279) – jfs 2015-09-21 01:05:08

回答

9

您可以設置一個全局套接字超時(*)

import socket 

timeout = 10 
socket.setdefaulttimeout(timeout) 

(*)編輯:隨着人們在評論正確地指出:這在技術上是真實的,但對於涉及單個套接字操作的任務,它只具有可預測的結果。一個HTTP請求由多個套接字操作組成(例如DNS請求或其他可能從HTTP客戶端抽象出來的東西)。因此,整體操作的超時變得不可預測。

+0

如果我設置一個套接字超時,所有HTTP請求發送從httplib超時後我設定的價值? – 2008-11-05 16:49:49

+0

這應該會影響* all *套接字操作。 – Tomalak 2008-11-05 17:01:37

7

不,沒有。

這是因爲HTTP spec沒有提供任何內容讓客戶端通過HTTP請求指定生存時間信息。正如您所提到的,您只能在TCP級別上執行此操作。

另一方面,服務器可能會通知客戶端有關HTTP狀態碼408 Request Timeout或相應的超時情況。 504 Gateway Timeout

4

你也可以連接的插座(與Python 2.5工程)上使用settimeout

connection = HTTPConnection('slow.service.com') 
connection.request(...) 
connection.sock.settimeout(5.0) 
response = connection.getresponse() 
response.read() 
connection.close() 

如果服務器不能送5秒內響應,socket.error將提高。