我有读取这样的网址的代码:
from urllib2 import Request, urlopen
req = Request(url)
for key, val in headers.items():
req.add_header(key, val)
res = urlopen(req, timeout = timeout)
# This line blocks
content = res.read()
Run Code Online (Sandbox Code Playgroud)
超时适用于urlopen()调用.但是然后代码进入res.read()调用,我想要读取响应数据,并且不会在那里应用超时.因此,读取调用可能几乎永远挂起,等待来自服务器的数据.我发现的唯一解决方案是使用一个信号来中断read(),因为我正在使用线程,所以不适合我.
还有哪些其他选择?是否有用于处理读取超时的Python的HTTP库?我看过httplib2和请求,他们似乎遇到了与上面相同的问题.我不想使用套接字模块编写自己的非阻塞网络代码,因为我认为应该已经有了一个库.
更新:以下解决方案都没有为我做.您可以自己查看设置套接字或urlopen超时在下载大文件时无效:
from urllib2 import urlopen
url = 'http://iso.linuxquestions.org/download/388/7163/http/se.releases.ubuntu.com/ubuntu-12.04.3-desktop-i386.iso'
c = urlopen(url)
c.read()
Run Code Online (Sandbox Code Playgroud)
至少在使用Python 2.7.3的Windows上,超时被完全忽略.
我正在尝试使用HTTPConnection
(2.7.8)发出请求,我已将超时设置为10 HTTPConnection(host, timeout=10)
.但是,HTTPConnection.request()
10秒后似乎没有超时.事实上,HTTPConnection.timeout
似乎甚至没有被阅读HTTPConnection.request()
(它只是通过阅读HTTPConnection.connect()
.我的理解是正确的吗?timeout
只适用于connect()
而不是request()
吗?有没有办法超时request()
?
更新:
我想我已经进一步缩小了这个问题:如果我不提供该方案,它将不会尊重套接字超时.如果提供了该方案,即完整的URL http://google.com:22222
,则它会相应地超时.我想知道为什么该计划的存在应该有所作为.也就是说,以下不尊重超时
socket.setdefaulttimeout(3)
conn = HTTPConnection('google.com:22222')
conn.timeout = 3
conn.request('GET', '')
Run Code Online (Sandbox Code Playgroud)
然而,这样做:
socket.setdefaulttimeout(3)
conn = HTTPConnection('http://google.com:22222')
conn.timeout = 3
conn.request('GET', '')
Run Code Online (Sandbox Code Playgroud)
但是,它不会发生在所有域中.
谢谢