Многопоточный сканер в Python действительно ускоряет процесс?

Искал написать немного веб-сканер в Python. Я начинал исследовать написание его в виде многопоточного скрипта с одним пулом загрузки потоков и одним пулом результатов обработки. Из-за GIL это фактически сделало бы одновременную загрузку? Как GIL влияет на веб-сканер? Будет ли каждый поток выбирать некоторые данные из сокета, затем переходить к следующему потоку, позволять ему выбирать некоторые данные из сокета и т. Д.?

По сути, я спрашиваю, действительно ли многопоточный сканер в python принесет мне большую производительность по сравнению с однопоточным?

Спасибо!

5 ответов

Решение

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

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

Изменить: Вот простой пример того, как использовать getPage Twisted для создания простого веб-сканера.

GIL не поддерживается интерпретатором Python при выполнении сетевых операций. Если вы выполняете работу, связанную с сетью (например, сканер), вы можете спокойно игнорировать эффекты GIL.

С другой стороны, вы можете измерить свою производительность, если вы создаете много потоков, выполняющих обработку (после загрузки). Ограничение количества потоков уменьшит влияние GIL на вашу производительность.

Посмотрите, как работает терапия. Это может вам очень помочь. Он не использует потоки, но может выполнять несколько "одновременных" загрузок, все в одном потоке.

Если подумать, у вас есть только одна сетевая карта, поэтому параллельная обработка не может помочь по определению.

Что делает скраперинг, так это просто не ждет ответа на один запрос перед отправкой другого. Все в одной теме.

Еще одно соображение: если вы просматриваете один веб-сайт, а сервер устанавливает ограничения на частоту запросов, которые вы можете отправлять с вашего IP-адреса, добавление нескольких потоков может не иметь значения.

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

Вы можете попробовать себя в тестировании, играя с темами от одного до "n". Я написал простой многопоточный сканер для Обнаружения веб-ресурсов и написал соответствующую статью об Автоматическом обнаружении каналов блогов и Twitter, Facebook, учетных записей LinkedIn, подключенных к бизнес-сайту. Вы можете выбрать, сколько потоков использовать, изменяя переменную класса NWORKERS в FocusedWebCrawler.

Другие вопросы по тегам