Python 具有超时的urlopen调用在超时后未终止
在Python2.4.4中,我使用Python 具有超时的urlopen调用在超时后未终止,python,sockets,timeout,urllib2,urlopen,Python,Sockets,Timeout,Urllib2,Urlopen,在Python2.4.4中,我使用urllib2.urlopen()请求资源。在发出请求之前,我将使用以下设置超时: socket.setdefaulttimeout(10) (此版本的Python太旧,无法使用内置超时的urlopen()版本。) 在大多数情况下,这似乎效果不错。然而,我遇到了一个服务器,它只是根据请求挂起。在Chrome浏览器中,需要将近5分钟的时间,浏览器才会放弃并显示: Google Chrome无法加载该网页,因为SERVERNAME响应时间太长。网站可能已关闭,或者
urllib2.urlopen()
请求资源。在发出请求之前,我将使用以下设置超时:
socket.setdefaulttimeout(10)
(此版本的Python太旧,无法使用内置超时的urlopen()
版本。)
在大多数情况下,这似乎效果不错。然而,我遇到了一个服务器,它只是根据请求挂起。在Chrome浏览器中,需要将近5分钟的时间,浏览器才会放弃并显示:
Google Chrome无法加载该网页,因为SERVERNAME响应时间太长。网站可能已关闭,或者您的Internet连接出现问题
在Python中,urlopen
请求似乎无限期地挂起,尽管设置了短超时。socket.setdefaulttimeout()
究竟控制什么,是否有办法强制这些连接超时(如果10秒过去了,不管发生了什么,终止尝试)
套接字有自己的超时。对于您发出的每个请求,请设置您想要的超时,然后重置超时(在所有情况下,包括失败)
可能发生的情况是,在某些情况下,服务器没有响应,超时时间比您设置的时间长
在上面的代码中,我们得到了默认超时(不管它是什么),对于我们的请求,我们将它设置为我们想要的,然后重置为它是什么,这样我们就不会更改任何内容
套接字有自己的超时。对于您发出的每个请求,请设置您想要的超时,然后重置超时(在所有情况下,包括失败)
可能发生的情况是,在某些情况下,服务器没有响应,超时时间比您设置的时间长
在上面的代码中,我们得到了默认超时(无论它是什么),对于我们的请求,我们将它设置为我们想要的,然后重置为它是什么,这样我们就不会更改任何内容。我在代码中基本上就是这样做的。问题(也是我的问题)是,即使以这种方式设置超时,我也会遇到调用无限期挂起的情况(远远超过我设置的超时值)。我试图弄清楚这是怎么回事,以及是否有办法确保在达到超时值时调用总是失败。问题(也是我的问题)是,即使以这种方式设置超时,我也会遇到调用无限期挂起的情况(远远超过我设置的超时值)。我试图弄清楚这是怎么回事,以及是否有办法确保在达到超时值时调用总是失败。
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)