2015-04-02 59 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