2

在 Python 2.4.4 中,我urllib2.urlopen()用于请求资源。在发出请求之前,我设置了一个超时:

socket.setdefaulttimeout(10)

(这个版本的 Python 太旧了,没有urlopen()内置超时的版本。)

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

谷歌浏览器无法加载网页,因为 SERVERNAME 响应时间过长。该网站可能已关闭,或者您的 Internet 连接可能出现问题。

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

4

1 回答 1

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)

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

可能发生的情况是,在某些情况下,服务器没有响应并且超时最终比您设置的要长。

在上面的代码中,我们得到了默认超时(不管它是什么),对于我们的请求,我们将它设置为我们想要的任何东西,然后重置为它是什么,这样我们就不会改变任何东西。

于 2012-07-12T18:37:31.217 回答