urllib2什么时候实际从网址下载文件?

use*_*955 2 python

url = "http://example.com/file.xml"
data = urllib2.urlopen(url)
data.read()
Run Code Online (Sandbox Code Playgroud)

问题是,何时从互联网上下载文件?当我做urlopen或.read()?在我的网络界面上,我看到两次都有高流量.

dda*_*daa 5

看到代码,我希望发生以下情况:

  1. urlopen()打开连接,并发送查询.然后服务器开始提供回复.此时,数据在缓冲区中累积,直到它们已满并且操作系统告诉服务器保持一段时间.
  2. 然后data.read()清空缓冲区,以便操作系统告诉服务器继续,然后下载其余的回复.

当然,如果回复足够短,或者如果响应足够.read()快,那么缓冲区没有时间填满,下载一次完成.


mha*_*wke 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()
Run Code Online (Sandbox Code Playgroud)

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

现在在正在运行的终端中输入内容nc.调用urlopen()仍然会阻止,直到你按下ENTER nc,即直到它收到一个新的行字符.因此urlopen(),在读取至少一个新行字符之前不会返回.(对于那些担心可能缓冲的人来说nc,这不是一个问题.urlopen()在它看到第一个新行字符之前会阻塞.)

因此应该注意,urlopen()将阻塞直到接收到第一个新行字符,之后可以从连接读取数据.在实践中,HTTP响应是短多线响应,因此urlopen()应该很快返回.