相关疑难解决方法(0)

使用urllib2或任何其他http库读取超时

我有读取这样的网址的代码:

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上,超时被完全忽略.

python sockets timeout http nonblocking

25
推荐指数
4
解决办法
1万
查看次数

HTTPConnection.request不尊重超时?

我正在尝试使用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)

但是,它不会发生在所有域中.

谢谢

python httplib httpconnection

3
推荐指数
1
解决办法
4505
查看次数

标签 统计

python ×2

http ×1

httpconnection ×1

httplib ×1

nonblocking ×1

sockets ×1

timeout ×1