Найти - Пользователи
Полная версия: парсер Grab vs tornado
Начало » Network » парсер Grab vs tornado
1 2
juche-songun
Вчера получил два линка про ансинхроные парсеры.
Торнадо:
http://www.py-my.ru/post/4f278211bbddbd0322000000
Граб:
http://grablib.org/docs/spider/tutorial.html

и там и там есть возможность запустить много поточно, вопрос какое число потоков будет самое оно чтоб не иметь проблем с джилом и каналом и допустим если всетаки будут проблемы с джилом, а канал 1Гб то может реализовать дополнительно мултипроцесинг?
Soteric
Предсказание числа потоков, поведения и результатов - самое неблагодарное дело в перфоманс тестах. Задавать такого рода вопросы, я думаю, бесполезно. Как я уже отвечал тебе в одной из тем, все зависит от доступности внешних ресурсов и от того сколько времени в процентном отношении составляет работа процессора и работа сети.

Если ты скачиваешь сайт за секунду, а парсишь его минуту, то большая часть нагрузки ложится на процессор и GIL, если я правильно понимаю, будет мешать. Если же наоборот, то работы на ядрах процессора будет немного и GIL не будет помехой. Это что касается потоков против процессов.

Если говорить о числе потоков, то все зависит от того доступны ли веб страницы, насколько быстро они отдаются и т.п. вещей. Например, ты заводишь десяток потоков, которые занимаются скачиванием страниц. Если все страницы доступны и отдаются со скоростью 100МБ, то это число оптимально. Десять потоков забили весь канал, они не простаивают и работают.
Теперь например ты доходишь до страниц, которые отдаются со скоростью 1КБ. Получается что все потоки работают, но канал по сути свободен, и свободны ядра процессора. Здесь хорошо бы потоков добавить. Или попались сайты, которые вообще недоступны. И вот твои десять потоков стоят несколько секунд и ждут когда пройдет таймаут соединения. При этом ты вообще не используешь серверные ресурсы.
Но если ты сделаешь потоков с большим запасом, например тысячу, и все вдруг наладится (сайты будут быстро отдаваться и все будут доступны), то на процессор сразу ляжет огромная нагрузка и он будет проводить много времени просто переключаясь между потоками.

Поэтому такие вещи всегда подбираются с помощью серии тестов и в конце концов выводится какое-то оптимальное соотношение, которое нормально работает в большинстве случаев. В общем случае рекомендации таковы, что число потоков (а в случае с питоном - лучше процессов), обрабатывающих тяжелые для процессора операции, должно быть равно числу ядер (меньше - свободные ядра, больше - потоки простаивают потому что нет свободных ресурсов). Все остальное можно подобрать как-то в зависимости от условий.
juche-songun
ок, а что вы скажите об грубовский потоках?
Soteric
К сожалению ничего. Никогда не работал ни с тем, ни с другим.
odnochlen
Можно тяжелую работу делать в одном потоке, а качать в тредпуле.
plusplus
Ссылки на асинхронные парсеры, а вы говорите о потоках и GIL? Может я чего недопонял, но по-моему это разные вещи. По крайней мере в grab.spider нет никаких потоков. Фреймворк работает в одном потоке и делает асинхронные http-запросы с помощью мультикурла, полагаю, что аналогично и у tornado.
juche-songun
odnochlen
Можно тяжелую работу делать в одном потоке, а качать в тредпуле.
Парсер простой, сложной работы там нет, в тред пуле тоже не вижу нужды, так как в начале создаю Н-ое число поток(процессов), но чёрт побери я же задал вопрос о тредах в спайдере, относительно торнадо так там я создам н-процессов, с Н-потоками на процесс.
juche-songun
plusplus
Ссылки на асинхронные парсеры, а вы говорите о потоках и GIL? Может я чего недопонял, но по-моему это разные вещи. По крайней мере в grab.spider нет никаких потоков. Фреймворк работает в одном потоке и делает асинхронные http-запросы с помощью мультикурла, полагаю, что аналогично и у tornado.
а это что? в ссылке на ман по грабу в первом посте.
if __name__ == '__main__':
    logging.basicConfig(level=logging.DEBUG)
    # Запустим парсер в многопоточном режиме - два потока
    # Можно больше, только вас яндекс забанит
    # Он вас и с двумя то потоками забанит, если много будете его беспокоить
    bot = ExampleSpider(thread_number=2)
    bot.run()
lorien
Grab::Spider работает в одном процессе, под потоками имеются в виду сетевые потоки т.е. количество потоков это количество сокетов, открытых для скачивания какого-либо документа из сети.

То же самое можно сказать про торнадо.

Вычислить оптимальное количество потоков (что бы это слово ни значило) легко: делаете икс потоков, если проблем с “гилом и каналом” нет, повыешаете количество потоков. И так до тех пор пока не появляются проблемы.
juche-songun
То есть это число того сколько одновременно соединений он открыл так? в моем случае я могу запустить по процессу на ядро и Н-количеству открытых сокетов на процесс так?

З.Ы.
Каждое соединение (открытый сокет) может быть на разные хосты?
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB