Многопроцессорный искатель в 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.