2011-12-09 91 views
2

超時後沒有終止在Python 2.4.4的urlopen調用,我使用urllib2.urlopen()請求資源。發出請求之前,我設置了超時:與超時

socket.setdefaulttimeout(10) 

(Python的這種版本太舊有內置的超時版本的urlopen()

在大多數情況下,這似乎工作正常。但是,我遇到了一個只能根據請求掛起的服務器。在Chrome瀏覽器中,瀏覽器放棄需要將近5分鐘,然後說:

谷歌瀏覽器無法加載網頁,因爲SERVERNAME花了很長時間迴應。該網站可能已關閉,或者您的Internet連接可能遇到問題。

在Python中,儘管設置了短暫超時,但urlopen請求似乎無限期地掛起。究竟是什麼socket.setdefaulttimeout()控制,是有沒有辦法強制執行這些連接的硬超時(如果在10秒的流逝,不管別人發生了什麼,終止嘗試的)?

回答

0
def _reset_timeout(self, timeout=None): 
    socket.setdefaulttimeout(timeout) 

def _set_timeout(self, timeout=None): 
    if timeout: 
     socket.setdefaulttimeout(timeout) 



default_timeout = socket.getdefaulttimeout() 
try: 
    self._set_timeout(timeout) 
    req = urllib2.Request(url) 
    response = urllib2.urlopen(request) 

finally: 
    self._reset_timeout(default_timeout) 

套接字有其自己的超時。對於您所做的每個請求,請設置所需的超時時間,然後重置超時時間(在所有情況下均包括失敗)

可能發生的情況是,在某些情況下,服務器不響應並且超時結束時間更長比你所設定的要好。

在這裏,在上面的代碼中,我們得到了默認的超時時間(不管它是什麼),併爲我們的要求,我們將它設置爲任何我們想做的,然後恢復到不管它是什麼,這樣我們就不會改變任何東西。

+0

我基本上做的是,在我的代碼。問題(和我的問題)是,以這種方式設置超時,即使,我碰到的情況下調用無限期掛起(早已過了超時值我設置)。我試圖找出如何這可能是,如果有一種方法,以保證用戶的通話總是儘快達到超時值失敗。 – jrdioko