Многопоточный сканер в Python действительно ускоряет процесс? - PullRequest
10 голосов
/ 14 мая 2010

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

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

спасибо!

Ответы [ 5 ]

8 голосов
/ 14 мая 2010

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

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

6 голосов
/ 14 мая 2010

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

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

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

1 голос
/ 14 мая 2010

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

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

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

1 голос
/ 14 мая 2010

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

0 голосов
/ 25 октября 2012

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

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

...