организация пулов для массовой загрузки нескольких URL - PullRequest
1 голос
/ 06 декабря 2010

Я занимаюсь разработкой польского веб-сайта для мониторинга блогосферы и ищу «лучшую практику» по обработке массовой загрузки контента на python.

Вот пример схемы рабочего процесса:

http://img577.imageshack.us/img577/2971/scheme.png

Описание:

Я классифицировал базу данных RSS-каналов (около 1000).Каждый час или около того я должен проверять фиды, если есть какие-то новые сообщения.Если это так, я должен анализировать каждый новый элемент.Процесс анализа обрабатывает метаданные каждого документа, а также загружает каждое изображение, найденное внутри.

Упрощенная однопотоковая версия кода:

for url, etag, l_mod in rss_urls:
    rss_feed = process_rss(url, etag, l_mod) # Read url with last etag, l_mod values
    if not rss:
        continue

    for new_item in rss_feed: # Iterate via *new* items in feed
        element = fetch_content(new_item) # Direct https request, download HTML source
        if not element:
            continue

        images = extract_images(element)
        goodImages = []
        for img in images:
            if img_qualify(img): # Download and analyze image if it could be used as a thumbnail
                goodImages.append(img)

Поэтому я выполняю итерацию по каналам RSS, загружая только каналыс новыми предметами.Загрузите каждый новый элемент из канала.Загрузите и проанализируйте каждое изображение в элементе.

HTTR-запросы появляются на следующих этапах: - загрузка xss-документа rss - загрузка x элементов, найденных в rss - загрузка всех изображений каждого элемента

решил попробовать библиотеку python gevent (www.gevent.org) для обработки загрузки содержимого с несколькими URL-адресами

Что я хочу получить в результате: - Возможность ограничить количество внешних http-запросов - Возможность parralel загрузки всех перечисленныхэлементы содержимого.

Каков наилучший способ сделать это?

Я не уверен, потому что я новичок в parralel программировании (ну, этот асинхронный запрос, вероятно, не имеет ничего общегоя вообще не знаю, как такие задачи решаются в зрелом мире.

Единственная идея, которая мне приходит в голову, - это использовать следующую технику: - запускать скрипт обработки через cronjob каждые45 минут - попытайтесь заблокировать файл с письменным процессом pid в самом начале.Если блокировка не удалась, проверьте список процессов для этого pid.Если pid не найден, возможно, в какой-то момент процесс завершился неудачно, и новый sart безопасен.- С помощью оболочки для запуска пула gevent для загрузки RSS-каналов на каждом этапе (новые элементы обнаруживаются) добавляются новые задания в quique для загрузки элементов, при каждом загружаемом элементе добавляются задачи для загрузки изображений.- Каждые несколько секунд проверяйте текущее состояние заданий, запускайте новое задание из quique, если в режиме FIFO есть свободные слоты.

Звук для меня нормальный, но, возможно, у такого рода заданий есть "наилучшая практика", и яЯ изобретаю колесо сейчас.Вот почему я публикую свой вопрос здесь.

Спасибо!

1 Ответ

0 голосов
/ 01 марта 2011

Этот подход звучит хорошо при первоначальном чтении. В этом примере показано, как ограничить параллелизм https://bitbucket.org/denis/gevent/src/tip/examples/dns_mass_resolve.py

...