juche-songun
Ноя. 9, 2012 07:28:51
Вчера получил два линка про ансинхроные парсеры.
Торнадо:
http://www.py-my.ru/post/4f278211bbddbd0322000000Граб:
http://grablib.org/docs/spider/tutorial.htmlи там и там есть возможность запустить много поточно, вопрос какое число потоков будет самое оно чтоб не иметь проблем с джилом и каналом и допустим если всетаки будут проблемы с джилом, а канал 1Гб то может реализовать дополнительно мултипроцесинг?
Soteric
Ноя. 9, 2012 08:35:36
Предсказание числа потоков, поведения и результатов - самое неблагодарное дело в перфоманс тестах. Задавать такого рода вопросы, я думаю, бесполезно. Как я уже отвечал тебе в одной из тем, все зависит от доступности внешних ресурсов и от того сколько времени в процентном отношении составляет работа процессора и работа сети.
Если ты скачиваешь сайт за секунду, а парсишь его минуту, то большая часть нагрузки ложится на процессор и GIL, если я правильно понимаю, будет мешать. Если же наоборот, то работы на ядрах процессора будет немного и GIL не будет помехой. Это что касается потоков против процессов.
Если говорить о числе потоков, то все зависит от того доступны ли веб страницы, насколько быстро они отдаются и т.п. вещей. Например, ты заводишь десяток потоков, которые занимаются скачиванием страниц. Если все страницы доступны и отдаются со скоростью 100МБ, то это число оптимально. Десять потоков забили весь канал, они не простаивают и работают.
Теперь например ты доходишь до страниц, которые отдаются со скоростью 1КБ. Получается что все потоки работают, но канал по сути свободен, и свободны ядра процессора. Здесь хорошо бы потоков добавить. Или попались сайты, которые вообще недоступны. И вот твои десять потоков стоят несколько секунд и ждут когда пройдет таймаут соединения. При этом ты вообще не используешь серверные ресурсы.
Но если ты сделаешь потоков с большим запасом, например тысячу, и все вдруг наладится (сайты будут быстро отдаваться и все будут доступны), то на процессор сразу ляжет огромная нагрузка и он будет проводить много времени просто переключаясь между потоками.
Поэтому такие вещи всегда подбираются с помощью серии тестов и в конце концов выводится какое-то оптимальное соотношение, которое нормально работает в большинстве случаев. В общем случае рекомендации таковы, что число потоков (а в случае с питоном - лучше процессов), обрабатывающих тяжелые для процессора операции, должно быть равно числу ядер (меньше - свободные ядра, больше - потоки простаивают потому что нет свободных ресурсов). Все остальное можно подобрать как-то в зависимости от условий.
juche-songun
Ноя. 9, 2012 14:46:13
ок, а что вы скажите об грубовский потоках?
Soteric
Ноя. 9, 2012 15:05:07
К сожалению ничего. Никогда не работал ни с тем, ни с другим.
odnochlen
Ноя. 9, 2012 15:09:23
Можно тяжелую работу делать в одном потоке, а качать в тредпуле.
plusplus
Ноя. 9, 2012 17:17:43
Ссылки на асинхронные парсеры, а вы говорите о потоках и GIL? Может я чего недопонял, но по-моему это разные вещи. По крайней мере в grab.spider нет никаких потоков. Фреймворк работает в одном потоке и делает асинхронные http-запросы с помощью мультикурла, полагаю, что аналогично и у tornado.
juche-songun
Ноя. 9, 2012 17:38:07
odnochlen
Можно тяжелую работу делать в одном потоке, а качать в тредпуле.
Парсер простой, сложной работы там нет, в тред пуле тоже не вижу нужды, так как в начале создаю Н-ое число поток(процессов), но чёрт побери я же задал вопрос о тредах в спайдере, относительно торнадо так там я создам н-процессов, с Н-потоками на процесс.
juche-songun
Ноя. 9, 2012 17:40:42
plusplus
Ссылки на асинхронные парсеры, а вы говорите о потоках и GIL? Может я чего недопонял, но по-моему это разные вещи. По крайней мере в grab.spider нет никаких потоков. Фреймворк работает в одном потоке и делает асинхронные http-запросы с помощью мультикурла, полагаю, что аналогично и у tornado.
а это что? в ссылке на ман по грабу в первом посте.
if __name__ == '__main__':
logging.basicConfig(level=logging.DEBUG)
# Запустим парсер в многопоточном режиме - два потока
# Можно больше, только вас яндекс забанит
# Он вас и с двумя то потоками забанит, если много будете его беспокоить
bot = ExampleSpider(thread_number=2)
bot.run()
lorien
Ноя. 9, 2012 17:51:14
Grab::Spider работает в одном процессе, под потоками имеются в виду сетевые потоки т.е. количество потоков это количество сокетов, открытых для скачивания какого-либо документа из сети.
То же самое можно сказать про торнадо.
Вычислить оптимальное количество потоков (что бы это слово ни значило) легко: делаете икс потоков, если проблем с “гилом и каналом” нет, повыешаете количество потоков. И так до тех пор пока не появляются проблемы.
juche-songun
Ноя. 9, 2012 19:03:34
То есть это число того сколько одновременно соединений он открыл так? в моем случае я могу запустить по процессу на ядро и Н-количеству открытых сокетов на процесс так?
З.Ы.
Каждое соединение (открытый сокет) может быть на разные хосты?