В чем разница между asyncio.create_task() и прямым вызовом корутины через await? Как работает планировщик asyncio, когда задача создана через create_task(), но текущий поток выполнения занят тяжелыми вычислениями?

await coro() исполняет корутину в текущей задаче и ждёт её; create_task() создаёт отдельную задачу для конкурентного выполнения. Занятый тяжёлым кодом event loop не может нормально переключать задачи.

Короткий ответ

Что ответить на собеседовании

await coro() исполняет корутину в текущей задаче и ждёт её; create_task() создаёт отдельную задачу для конкурентного выполнения. Занятый тяжёлым кодом event loop не может нормально переключать задачи.

Подробный разбор

Ответ с пояснениями

await coro() исполняет корутину в текущей задаче и ждёт её; create_task() создаёт отдельную задачу для конкурентного выполнения. Занятый тяжёлым кодом event loop не может нормально переключать задачи.

При обычном планировании новая task получает выполнение, когда loop вернёт себе управление. Если текущая корутина после create_task запускает длинный цикл без уступки, остальные ждут. Eager-режим может начать новую корутину сразу, но не создаёт отдельного потока и не устраняет блокировку. Сохраняйте task, ожидайте результат или контролируйте завершение; CPU-работу выносите в подходящий executor.

Источник: docs.python.org.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее