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

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

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

спасибо!

Ответ 1

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

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

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

Ответ 2

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

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

Ответ 3

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

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

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

Ответ 4

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

Ответ 5

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

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