2008-10-21 27 views
2
url = "http://example.com/file.xml" 
data = urllib2.urlopen(url) 
data.read() 

现在的问题是,什么时候该文件从网上下载?当我做urlopen或.read()?在我的网络接口上,我看到两次都有很高的流量。何时urllib2实际上从网址下载文件?

回答

5

不用其他看代码,我期望会发生以下情况:

  1. urlopen()打开连接,并将查询。然后服务器开始提供回复。此时,数据在缓冲区中累积,直到它们已满并且操作系统告诉服务器保持一段时间。
  2. 然后data.read()清空缓冲区,所以操作系统会通知服务器继续运行,并回复其余部分。

当然,如果回复足够短,或者.read()发生得足够快,那么缓冲区没有时间填满并且下载一次发生。

+0

感谢您快速回答 – user20955 2008-10-21 20:36:09

5

我同意ddaa。但是,如果您想了解这类事情,则可以使用类似nc(在* nix中)的方式设置虚拟服务器,然后在交互式Python解释器中打开该URL。

在一个终端中,运行nc -l 1234,它将打开一个套接字并侦听本地计算机的端口1234上的连接。 nc将接受传入的连接并显示从套接字读取的任何内容。您输入nc的任何内容都将通过套接字发送到远程连接,在本例中为Python的urlopen()

运行Python在另一个端子和输入您的代码,即

data = urllib2.urlopen('http://127.0.0.1:1234') 
data.read() 

urlopen()到调用将建立到服务器的连接,发送该请求,然后方框等待响应。您将看到nc将HTTP请求打印到其终端中。

现在,在运行nc的终端中输入内容。拨打urlopen()仍然会阻止,直到您按nc中的ENTER,即,直到它收到一个新的行字符。因此,urlopen()只有读取了至少一个新的行字符才会返回。 (对于那些担心可能存在的缓冲通过nc,这不是一个问题。urlopen()将阻塞,直到它看到的第一个新行字符)。

所以应该注意的是,urlopen()将阻塞,直到接收到第一个换行符之后,可以从连接中读取数据。实际上,HTTP响应是简短的多行响应,因此urlopen()应该很快返回。