Что происходит в event loop при вызове корутины и await в Python
Что проверяют
Понимаете ли вы, что await это не про параллельность, а про точку, в которой корутина возвращает управление циклу событий. Ответ сразу показывает, писали ли вы асинхронный код или только читали про него.
Как отвечать
Начните с того, что вызов асинхронной функции ничего не выполняет: он возвращает объект корутины. Тело начнёт работать, когда корутину кто-то прокрутит: asyncio.run, await или create_task. Забытая корутина так и остаётся невыполненной, интерпретатор ругается предупреждением о том, что её никто не ожидал.
Механика цикла такая. Задача оборачивает корутину и шлёт ей значения, пока та не дойдёт до места, где действительно нужно ждать: до незавершённого будущего. Тогда задача вешает на это будущее обработчик и отдаёт управление циклу. Цикл разбирает очередь готовых обработчиков, затем уходит в системный вызов ожидания событий с таймаутом до ближайшего таймера. Сработал таймер или сокет стал готов, будущее завершается, обработчик ставит задачу обратно в очередь, и корутина продолжается с места остановки.
Отсюда главное уточнение: await вложенной корутины сам по себе управление не отдаёт, это обычный вызов внутри той же задачи. Уступание происходит только там, где в цепочке встретилось незавершённое будущее, а await asyncio.sleep(0) уступает принудительно. Конкурентность появляется из create_task и gather, а два await подряд выполняются последовательно.
Где спотыкаются
Ставят async и await по всему коду и ждут ускорения. Два последовательных ожидания дают ровно ту же сумму времени, что и синхронный вариант: чтобы запросы шли одновременно, нужны задачи или gather.
Второе: зовут блокирующий код прямо в корутине. Синхронный драйвер базы, time.sleep, тяжёлый счёт останавливают весь цикл вместе со всеми задачами. Такое выносят в поток через asyncio.to_thread или в отдельный процесс.
Третье: теряют ссылку на созданную задачу и не смотрят её результат. Задача, на которую никто не держит ссылку, может быть собрана сборщиком мусора до завершения, а исключение внутри неё молчит, пока задачу не ожидают.