asyncio против потоков
Вопрос
Чем asyncio отличается от многопоточности? Когда вы выберете одно, а когда другое?
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
asyncio: один поток, кооперативная многозадачность, переключение на await
Потоки: вытесняющая многозадачность ОС, переключение где угодно
Корутины дешёвые, тысячи соединений; поток дороже по памяти
asyncio требует асинхронных библиотек, блокирующий вызов стопорит всё
Потоки для синхронных библиотек и небольшого числа задач
Ни то, ни другое не ускоряет CPU-bound код
Что могут спросить следом
- Что будет, если в async-обработчике вызвать requests?
- Есть ли гонки в asyncio?
Разбор
Образцовый ответ: «asyncio это кооперативная многозадачность в одном потоке: задача сама отдаёт управление в точке await, и цикл событий переключается на другую готовую задачу. В потоках многозадачность вытесняющая: ОС может переключить поток в любой момент, поэтому нужно больше синхронизации. Корутина стоит очень дёшево, и один процесс держит десятки тысяч соединений, а поток требует память под стек и переключения ядра. Минус asyncio: весь стек должен быть асинхронным, один блокирующий вызов, тот же requests.get или тяжёлый цикл, останавливает все задачи процесса. Поэтому выбираю asyncio для сетевых сервисов с большим числом одновременных соединений: API на FastAPI, вебсокеты, боты, массовые HTTP-запросы. Потоки беру, когда библиотеки синхронные и задач немного, например параллельно опросить 20 внешних API в скрипте. Для CPU-bound не подходит ни то, ни другое, там процессы. И в asyncio тоже бывают логические гонки, если состояние меняется по обе стороны await».
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.