Параллельные загрузки - Python

план таков:

Я загружаю веб-страницу, собираю список изображений, проанализированных в DOM, а затем загружаю их. После этого я буду проходить через изображения, чтобы оценить, какой образ лучше всего подходит для представления веб-страницы.

Проблема в том, что изображения загружаются 1 на 1, и это может занять довольно много времени.


Было бы здорово, если бы кто-нибудь мог указать мне в каком-то отношении тему.

Помощь будет очень оценена.

Ответ 1

Ускорение обхода в основном Eventlet основного варианта использования. Это очень быстро - у нас есть приложение, которое должно ударить 2 000 000 URL-адресов за несколько минут. Он использует самый быстрый интерфейс событий в вашей системе (epoll, вообще) и использует greenthreads (которые построены поверх сопрограмм и очень недороги), чтобы упростить запись.

Здесь пример из документов:

urls = ["http://www.google.com/intl/en_ALL/images/logo.gif",
     "https://wiki.secondlife.com/w/images/secondlife.jpg",
     "http://us.i1.yimg.com/us.yimg.com/i/ww/beta/y3.gif"]

import eventlet
from eventlet.green import urllib2  

def fetch(url):
  body = urllib2.urlopen(url).read()
  return url, body

pool = eventlet.GreenPool()
for url, body in pool.imap(fetch, urls):
  print "got body from", url, "of length", len(body)

Это довольно хорошая отправная точка для разработки более полнофункционального искателя. Не стесняйтесь появляться в #eventlet на Freenode, чтобы обратиться за помощью.

[обновление: я добавил в документы более сложный рекурсивный пример веб-искателя. Клянусь, что это было в работах до того, как этот вопрос был задан, но вопрос, наконец, вдохновил меня на его завершение.:)]

Ответ 2

Хотя потоки, конечно, возможны, я бы предложил asyncore - отличный пример здесь, который показывает точно одновременную выборку двух URL-адресов (легко обобщить на любой список URL-адресов!).

Ответ 3

Здесь приведена статья о потоковой передаче, в которой в качестве примера используется выборка URL.

Ответ 4

В настоящее время есть отличные библиотеки Python, которые вы можете использовать - urllib3 и requests