在Python 2.4.4中,我使用urllib2.urlopen()
来请求资源。在发出请求之前,我正在设置超时:
socket.setdefaulttimeout(10)
(此版本的Python太旧,无法使用内置超时的urlopen()
版本。)
在大多数情况下,这似乎工作正常。但是,我遇到了一个根据请求挂起的服务器。在Chrome中,浏览器放弃前需要将近5分钟,并说:
Google Chrome无法加载网页,因为SERVERNAME需要很长时间才能响应。网站可能已关闭,或者您可能遇到与Internet连接有关的问题。
在Python中,urlopen
请求似乎无限期挂起,尽管设置了一个短暂的超时。 socket.setdefaulttimeout()
究竟是什么控制的,有没有办法在这些连接上强制执行硬超时(如果10秒过去,无论发生什么,都会终止尝试)?
答案 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)
套接字有自己的超时时间。对于您提出的每个请求,请设置所需的超时,然后重置超时(在所有情况下包括失败)
可能发生的情况是,在某些情况下,服务器没有响应,超时的结束时间比您设置的时间长。
在上面的代码中,我们得到了默认的超时(无论它是什么),对于我们的请求,我们将它设置为我们想要的任何内容,然后重置为它,以便我们不做任何改变。