Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 具有超时的urlopen调用在超时后未终止_Python_Sockets_Timeout_Urllib2_Urlopen - Fatal编程技术网

Python 具有超时的urlopen调用在超时后未终止

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响应时间太长。网站可能已关闭,或者

在Python2.4.4中,我使用
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)