url = "http://example.com/file.xml"
data = urllib2.urlopen(url)
data.read()
问题是,何时从互联网上下载文件?当我做urlopen或.read()?在我的网络界面上,我看到两次都有高流量。
答案 0 :(得分:5)
没有看到代码,我希望发生以下情况:
urlopen()
打开连接,然后发送查询。然后服务器开始提供回复。此时,数据会累积在缓冲区中,直到它们已满,操作系统会告诉服务器保持一段时间。data.read()
清空缓冲区,因此操作系统会告诉服务器继续运行,其余的回复都会被下载。当然,如果回复足够短,或者.read()
发生得足够快,那么缓冲区没有时间填满,下载一次完成。
答案 1 :(得分: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()
应该很快返回。