Async / IO и параллелизм - PullRequest
       64

Async / IO и параллелизм

0 голосов
/ 16 сентября 2018

Я использую aiohttp для создания веб-сервера Async / IO.Однако, насколько я понимаю, Async / IO означает, что сервер может работать только на одном ядре обработки.Обычные синхронные серверы, такие как uwsgi, с другой стороны, могут полностью использовать вычислительные ресурсы компьютера с действительно параллельными потоками и процессами.Почему же Async / IO является новым и модным, если он меньше параллелен, чем многопроцессорная обработка?Могут ли асинхронные серверы типа aiohttp быть мультипроцессорными?

Ответы [ 2 ]

0 голосов
/ 17 сентября 2018

Почему Async / IO является новым и модным, если он менее параллелен, чем многопроцессорная?

Два решают разные проблемы. Asyncio позволяет писать асинхронный код без «ада обратного вызова». await позволяет использовать такие конструкции, как циклы, ifs, try / exc и т. Д., С автоматическим приостановлением и переключением задач. Это позволяет обслуживать большое количество соединений без необходимости создавать поток для каждого соединения, но с поддерживаемым кодом, который выглядит , как если бы он был написан для блокировки соединений. Таким образом, asyncio помогает только с кодом, единственное узкое место которого ожидает внешние события, такие как сетевой ввод-вывод и таймауты.

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

В теории возможен многопоточный асинхронный фреймворк - например, Rust's tokio такой - но он не будет работать в Python из-за того, что GIL препятствует использованию нескольких ядер. Также вряд ли удастся объединить асинхронное и многопроцессорное выполнение, поскольку как реализация асинхронного режима, так и код, использующий асинхронный режим, сильно зависят от общего состояния.

0 голосов
/ 17 сентября 2018

Gunicorn может помочь вам:

gunicorn module:app --bind 0.0.0.0:8080 --worker-class aiohttp.GunicornWebWorker --workers 4

...