在Python 2.6,一個新的「超時」參數被添加到httplib.HTTPConnection類: http://docs.python.org/library/httplib.html#httplib.HTTPConnectionHTTP請求超時
然而,這僅僅是用於連接到服務器的超時。我期待爲請求設置超時值,而不是連接。這似乎沒有被httplib支持。
有什麼辦法可以模擬這種行爲嗎?
在Python 2.6,一個新的「超時」參數被添加到httplib.HTTPConnection類: http://docs.python.org/library/httplib.html#httplib.HTTPConnectionHTTP請求超時
然而,這僅僅是用於連接到服務器的超時。我期待爲請求設置超時值,而不是連接。這似乎沒有被httplib支持。
有什麼辦法可以模擬這種行爲嗎?
您可以設置一個全局套接字超時(*):
import socket
timeout = 10
socket.setdefaulttimeout(timeout)
(*)編輯:隨着人們在評論正確地指出:這在技術上是真實的,但對於涉及單個套接字操作的任務,它只具有可預測的結果。一個HTTP請求由多個套接字操作組成(例如DNS請求或其他可能從HTTP客戶端抽象出來的東西)。因此,整體操作的超時變得不可預測。
如果我設置一個套接字超時,所有HTTP請求發送從httplib超時後我設定的價值? – 2008-11-05 16:49:49
這應該會影響* all *套接字操作。 – Tomalak 2008-11-05 17:01:37
不,沒有。
這是因爲HTTP spec沒有提供任何內容讓客戶端通過HTTP請求指定生存時間信息。正如您所提到的,您只能在TCP級別上執行此操作。
另一方面,服務器可能會通知客戶端有關HTTP狀態碼408 Request Timeout或相應的超時情況。 504 Gateway Timeout。
你也可以連接的插座(與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
將提高。
相關:[讀取超時使用urllib2或任何其他http庫](http://stackoverflow.com/q/9548869/4279) – jfs 2015-09-21 01:05:08