在 Python 2.4.4 中,我使用 urllib2.urlopen() 来请求资源。在发出请求之前,我设置了一个超时:
socket.setdefaulttimeout(10)
(此版本的 Python 太旧,无法提供内置超时的 urlopen() 版本。)
在大多数情况下,这似乎工作正常。但是,我遇到了一个服务器,它只是根据请求挂起。在 Chrome 中,浏览器会在将近 5 分钟后放弃并显示:
Google Chrome could not load the webpage because SERVERNAME took too long to respond. The website may be down, or you may be experiencing issues with your Internet connection.
在 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)
套接字有自己的超时时间。对于您发出的每个请求,请设置您想要的超时,然后重置超时(在所有情况下,包括失败)
可能发生的情况是,在某些情况下,服务器没有响应,超时时间比您设置的时间长。
在上面的代码中,我们获得了默认超时(无论它是什么),并且对于我们的请求,我们将其设置为我们想要的任何值,然后重置为任何值,这样我们就不会更改任何内容。
