Python urllib2实际上什么时候从url下载文件?
问题是,该文件将于何时从互联网上下载?当我执行urlopen或.read()时?在我的网络界面上,我看到两次流量都很高 如果不看代码,我预计会发生以下情况:Python urllib2实际上什么时候从url下载文件?,python,Python,问题是,该文件将于何时从互联网上下载?当我执行urlopen或.read()时?在我的网络界面上,我看到两次流量都很高 如果不看代码,我预计会发生以下情况: urlopen()打开连接并发送查询。然后服务器开始提供回复。此时,数据在缓冲区中累积,直到缓冲区已满,操作系统通知服务器等待一段时间 然后data.read() 当然,如果回复足够短,或者.read()发生得足够快,那么缓冲区就没有时间填满,下载一次完成。我同意ddaa。但是,如果您想了解这种情况,可以使用类似于nc(in*nix)的方法
urlopen()
打开连接并发送查询。然后服务器开始提供回复。此时,数据在缓冲区中累积,直到缓冲区已满,操作系统通知服务器等待一段时间data.read()
当然,如果回复足够短,或者
.read()
发生得足够快,那么缓冲区就没有时间填满,下载一次完成。我同意ddaa。但是,如果您想了解这种情况,可以使用类似于nc
(in*nix)的方法设置一个虚拟服务器,然后在交互式Python解释器中打开URL
在一个终端中,运行nc-l 1234
,它将打开一个套接字并侦听本地机器端口1234上的连接nc
将接受传入连接并显示从套接字读取的内容。您在nc
中键入的任何内容都将通过套接字发送到远程连接,在本例中是Python的urlopen()
在另一个终端中运行Python并输入代码,即
url = "http://example.com/file.xml"
data = urllib2.urlopen(url)
data.read()
调用urlopen()
将建立到服务器的连接,发送请求,然后阻止等待响应。您将看到nc
将HTTP请求打印到其终端
现在在运行nc
的终端中键入一些内容。调用urlopen()
仍将被阻止,直到您在nc
中按ENTER键,也就是说,直到它接收到新行字符。因此,urlopen()
在读取至少一个新行字符之前不会返回。(对于那些担心可能通过nc
进行缓冲的人来说,这不是问题。urlopen()
因此需要注意的是,urlopen()
将一直阻塞,直到接收到第一个新行字符,然后才能从连接读取数据。实际上,HTTP响应是短的多行响应,因此urlopen()
应该很快返回。在文档中说明:函数返回类似文件的对象。所以我想ddaa是对的。“类似文件”只是指对象提供的接口。我所描述的是,如果没有将所有数据下载到.urlopen()中,那么您自然会从TCP套接字中获得行为,这将破坏类似文件的接口。
data = urllib2.urlopen('http://127.0.0.1:1234')
data.read()