Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python urllib2实际上什么时候从url下载文件?_Python - Fatal编程技术网

Python urllib2实际上什么时候从url下载文件?

Python urllib2实际上什么时候从url下载文件?,python,Python,问题是,该文件将于何时从互联网上下载?当我执行urlopen或.read()时?在我的网络界面上,我看到两次流量都很高 如果不看代码,我预计会发生以下情况: urlopen()打开连接并发送查询。然后服务器开始提供回复。此时,数据在缓冲区中累积,直到缓冲区已满,操作系统通知服务器等待一段时间 然后data.read() 当然,如果回复足够短,或者.read()发生得足够快,那么缓冲区就没有时间填满,下载一次完成。我同意ddaa。但是,如果您想了解这种情况,可以使用类似于nc(in*nix)的方法

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

如果不看代码,我预计会发生以下情况:

  • 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()