Вопрос проверяет понимание кооперативной многозадачности и механизма await.
Переключение контекста в asyncio происходит в момент выполнения await. Корутина добровольно уступает управление event loop, который может запустить другую задачу. В отличие от потоков, переключение не происходит принудительно. Это называется кооперативной многозадачностью.
В asyncio нет принудительного переключения, как в потоках. Переключение происходит только в точках ожидания.
При выполнении:
await some_io()
происходит:
текущая корутина приостанавливается
управление возвращается event loop
loop выбирает другую готовую задачу
после завершения операции корутина возобновляется
Если в коде нет await, переключения не будет.
Пример:
async def task():
for i in range(10**8):
pass # блокировка, переключения нет
Event loop хранит:
очередь готовых задач
задачи, ожидающие I/O
таймеры
И последовательно их запускает.
В потоках:
переключение делает ОС
возможно в любой момент
В asyncio:
переключение делает программа
только в точках await
Переключение контекста в asyncio происходит кооперативно — только в момент await, когда корутина добровольно отдаёт управление event loop.