Почему Async / IO является новым и модным, если он менее параллелен, чем многопроцессорная?
Два решают разные проблемы. Asyncio позволяет писать асинхронный код без «ада обратного вызова». await
позволяет использовать такие конструкции, как циклы, ifs, try / exc и т. Д., С автоматическим приостановлением и переключением задач. Это позволяет обслуживать большое количество соединений без необходимости создавать поток для каждого соединения, но с поддерживаемым кодом, который выглядит , как если бы он был написан для блокировки соединений. Таким образом, asyncio помогает только с кодом, единственное узкое место которого ожидает внешние события, такие как сетевой ввод-вывод и таймауты.
С другой стороны, многопроцессорность подразумевает распараллеливание выполнения кода с привязкой к процессору, такого как научные вычисления. Поскольку потоки ОС не помогают из-за GIL , многопроцессорность порождает отдельные процессы ОС и распределяет работу между ними. Это происходит за счет того, что процессы не могут легко обмениваться данными - все взаимодействие осуществляется либо через сериализацию по каналам, либо с выделенными прокси .
В теории возможен многопоточный асинхронный фреймворк - например, Rust's tokio такой - но он не будет работать в Python из-за того, что GIL препятствует использованию нескольких ядер. Также вряд ли удастся объединить асинхронное и многопроцессорное выполнение, поскольку как реализация асинхронного режима, так и код, использующий асинхронный режим, сильно зависят от общего состояния.