2015-04-02 3 views
0

Глядя на коде питона Reddit для выбора изображения из HTML URL-адреса в: 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). Это означает, что клиент ждет вызова close() в сокете, что происходит, когда вы используете read().

Чтобы ответить на ваш вопрос, все данные отправляются вам независимо от того, сколько вы читаете, и это происходит до чтения.

Cheers!

+0

Очень интересно, тогда появляется reddit, не получает полного выигрыша от производительности, из которого они подразумевают, что они попадают в комментарий (хотя они не избегают цикла через остальную часть данных изображения. Sidebar - есть ли какое-либо преимущество в памяти, загрузка данных полного байта изображения в память? Знание сокетов немного нечеткое). Есть ли у вас какие-либо ссылки на этот ответ, где я могу больше узнать или вы просто знакомы с внутренними работами urllib2? – kcmoffat

+0

Я наблюдал за гнездом и делал паузу в разных местах процесса. Все уже находится в памяти после первоначального запроса в объекте, возвращаемом из urllib2.urlopen(), но если он дублируется, он сохранит дополнительную память. –

+0

Большое спасибо! – kcmoffat

Смежные вопросы