具有超时的urlopen调用在超时后不会终止

时间:2011-12-09 21:08:32

标签: python sockets timeout urllib2 urlopen

在Python 2.4.4中,我使用urllib2.urlopen()来请求资源。在发出请求之前,我正在设置超时:

socket.setdefaulttimeout(10)

(此版本的Python太旧,无法使用内置超时的urlopen()版本。)

在大多数情况下,这似乎工作正常。但是,我遇到了一个根据请求挂起的服务器。在Chrome中,浏览器放弃前需要将近5分钟,并说:

  

Google Chrome无法加载网页,因为SERVERNAME需要很长时间才能响应。网站可能已关闭,或者您可能遇到与Internet连接有关的问题。

在Python中,urlopen请求似乎无限期挂起,尽管设置了一个短暂的超时。 socket.setdefaulttimeout()究竟是什么控制的,有没有办法在这些连接上强制执行硬超时(如果10秒过去,无论发生什么,都会终止尝试)?

1 个答案:

答案 0 :(得分: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)

套接字有自己的超时时间。对于您提出的每个请求,请设置所需的超时,然后重置超时(在所有情况下包括失败)

可能发生的情况是,在某些情况下,服务器没有响应,超时的结束时间比您设置的时间长。

在上面的代码中,我们得到了默认的超时(无论它是什么),对于我们的请求,我们将它设置为我们想要的任何内容,然后重置为它,以便我们不做任何改变。