2015-04-02 61 views
0

望着reddit的Python代码从一个URL的HTML选择图像:https://github.com/reddit/reddit/blob/master/r2/r2/lib/media.py#L178是否urllib.urlopen()懒惰地下载数据?

在_fetch_image_size,他们使用的urllib2,如同在拍摄字节调用response.read(1024)后,仅下载。我搜索了一下,以确认urllib2是优化的,只有在调用read()时才会懒惰地下载字节,但我无法在返回类型(httplib.HTTPResponse)上找到很多文档。只是它是一个类似文件的对象(所以你可以调用它的read())。

我测试了urllib2.urlopen(),它对我有一点延迟,但也许这只是打开套接字的延迟。对结果调用read()对于较大的图像非常快。

回答

0

当调用urllib2.urlopen()时,它会创建一个套接字并将数据从服务器发送到客户端。此时,插座处于CLOSE-WAIT(figure 6)。这意味着它正在等待客户端调用socket上的close(),这发生在使用read()时。

要回答你的问题,所有的数据都会发送给你,无论你阅读的是多少,它发生在阅读之前。

干杯!

+0

非常有趣,那么它看起来reddit没有得到他们意见中获得的全部性能好处(虽然他们确实避免循环通过图像数据的其余部分。将完整的图像字节数据加载到内存中?我的插座知识有点模糊)。你有没有任何关于这个答案的参考资料,我可以阅读更多内容,或者你对urllib2的内部工作非常熟悉? – kcmoffat 2015-04-03 01:02:49

+0

我监视了套接字,并在此过程中的不同位置暂停。在从urllib2.urlopen()返回的对象中的初始请求之后,所有东西都已经在内存中,但是如果它被复制,那么它将保存额外的内存。 – 2015-04-03 20:10:16

+0

非常感谢! – kcmoffat 2015-04-03 22:01:43