Skip to main content
 首页 » 编程设计

python之超时后 urlopen 调用不会在超时后终止

2025年05月04日10落叶

在 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) 

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

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

在上面的代码中,我们获得了默认超时(无论它是什么),并且对于我们的请求,我们将其设置为我们想要的任何值,然后重置为任何值,这样我们就不会更改任何内容。