Ответ вслух Middle asyncio спрашивают часто обновлено

asyncio против потоков

Вопрос

Чем asyncio отличается от многопоточности? Когда вы выберете одно, а когда другое?

Попробуйте сами

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

Показать ответ и разбор

Коротко

Образцовый ответ: «asyncio это кооперативная многозадачность в одном потоке: задача сама отдаёт управление в точке await, и цикл событий переключается на другую готовую задачу. В потоках многозадачность вытесняющая: ОС может переключить поток в любой момент, поэтому нужно больше синхронизации.

Что должно прозвучать в ответе

  • 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 ошибок.