aiohttp по сравнению с pycurl multi, поскольку у python есть gil, какие преимущества я получу, переключившись на aiohttp?

В краулере я работаю. Он делает запросы с помощью pycurl multi.

Какого повышения эффективности я могу ожидать, если перейду на aiohttp?

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

Кто-нибудь прошел через это и может предложить некоторые идеи?

Спасибо


person Dan    schedule 01.06.2019    source источник


Ответы (1)


Глобальная блокировка интерпретатора - это мьютекс, который защищает доступ к объектам Python, предотвращая одновременное выполнение байткодами Python несколькими потоками.

Это означает, что это влияет на производительность вашего многопоточного кода. AsyncIO больше предназначен для обработки одновременных запросов, а не параллельных. С AsyncIO ваш код сможет обрабатывать больше запросов даже с однопоточным циклом, потому что сетевой ввод-вывод будет асинхронным. Это означает, что пока сопрограмма выбирает сетевой ресурс, она «приостанавливает» и не блокирует поток, в котором она запущена, и разрешает выполнение других сопрограмм. Основная идея asyncIO заключается в том, что даже с одним потоком вы можете заставить ваш процессор постоянно выполнять вычисления вместо ожидания сетевого ввода-вывода.

Если вы хотите больше узнать об asyncIO, вам необходимо понять разницу между параллелизмом и параллелизмом. Это отличный Поговорите на эту тему, но принципы те же.

Таким образом, даже если у python есть GIL, производительность с asyncIO будет намного лучше, чем с использованием традиционных потоков. Вот несколько тестов:

введите здесь описание изображения

person georgeok    schedule 06.06.2019