url = "http://example.com/file.xml"
data = urllib2.urlopen(url)
data.read()
现在的问题是,什么时候该文件从网上下载?当我做urlopen或.read()?在我的网络接口上,我看到两次都有很高的流量。何时urllib2实际上从网址下载文件?
url = "http://example.com/file.xml"
data = urllib2.urlopen(url)
data.read()
现在的问题是,什么时候该文件从网上下载?当我做urlopen或.read()?在我的网络接口上,我看到两次都有很高的流量。何时urllib2实际上从网址下载文件?
不用其他看代码,我期望会发生以下情况:
urlopen()
打开连接,并将查询。然后服务器开始提供回复。此时,数据在缓冲区中累积,直到它们已满并且操作系统告诉服务器保持一段时间。data.read()
清空缓冲区,所以操作系统会通知服务器继续运行,并回复其余部分。当然,如果回复足够短,或者.read()
发生得足够快,那么缓冲区没有时间填满并且下载一次发生。
我同意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()
应该很快返回。
感谢您快速回答 – user20955 2008-10-21 20:36:09