aiohttp по сравнению с pycurl multi, поскольку у python есть gil, какие преимущества я получу, переключившись на aiohttp? - PullRequest
1 голос
/ 01 июня 2019

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

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

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

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

Спасибо

1 Ответ

1 голос
/ 06 июня 2019

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

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

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

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

enter image description here

...