Вопрос проверяет понимание механизма переключения контекста между корутинами в асинхронном программировании.
Корутины работают на основе кооперативной многозадачности. В отличие от потоков, которые могут быть прерваны планировщиком ОС в любой момент, корутина сама решает, когда передать управление. Это происходит в точках ожидания, обозначенных ключевым словом await.
Event loop — это центральный диспетчер, который управляет выполнением корутин. Когда корутина встречает await, она приостанавливается и возвращает управление event loop'у. Event loop проверяет, какие корутины готовы к выполнению (например, завершилась операция ввода-вывода), и возобновляет их с того места, где они остановились.
import asyncio
async def task(name, delay):
print(f"{name} началась")
await asyncio.sleep(delay) # точка переключения
print(f"{name} завершена")
async def main():
await asyncio.gather(
task("A", 2),
task("B", 1)
)
asyncio.run(main())В этом примере корутина A запускается, доходит до await asyncio.sleep(2) и передаёт управление. Event loop запускает корутину B, которая ждёт 1 секунду. Через 1 секунду B завершается, а через 2 — A. Переключение происходит только в точках await.
Этот механизм идеален для I/O-bound задач: работа с сетью, файлами, базами данных. Он позволяет обрабатывать тысячи соединений без создания потоков, экономя память и избегая проблем синхронизации.
Вывод: Кооперативное переключение корутин эффективно для асинхронных операций, где ожидание внешних ресурсов — основное узкое место. Используйте его в веб-серверах, чат-приложениях и любых системах с большим количеством параллельных I/O операций.