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

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

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

спасибо!

10
задан James 13 May 2010 в 23:02
поделиться

4 ответа

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

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

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

1
ответ дан 3 December 2019 в 21:58
поделиться

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

1
ответ дан 3 December 2019 в 21:58
поделиться

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

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

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

6
ответ дан 3 December 2019 в 21:58
поделиться

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

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

8
ответ дан 3 December 2019 в 21:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: