Как поведёт себя CPU-bound задача, запущенная внутри asyncio.create_task()?

Для этого применяются:

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

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

В asyncio для управления задачами, которые ограничены по CPU (то есть выполняют тяжёлые вычисления), используется механизм запуска таких задач в отдельном потоке или процессе, так как сам asyncio основан на событийном цикле и не подходит для CPU-bound задач.

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

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

В asyncio для управления задачами, которые ограничены по CPU (то есть выполняют тяжёлые вычисления), используется механизм запуска таких задач в отдельном потоке или процессе, так как сам asyncio основан на событийном цикле и не подходит для CPU-bound задач.

Для этого применяются:

  • run_in_executor() — позволяет запускать блокирующие или CPU-интенсивные функции в пуле потоков или процессов, не блокируя основной event loop.
  • ThreadPoolExecutor и ProcessPoolExecutor из модуля concurrent.futures — используются как исполнители для запуска задач в отдельных потоках или процессах.

Пример:

import asyncio
from concurrent.futures import ProcessPoolExecutor

def cpu_bound_task(x):
    # Некоторая тяжёлая вычислительная задача
    return sum(i * i for i in range(x))

async def main():
    loop = asyncio.get_running_loop()
    with ProcessPoolExecutor() as pool:
        result = await loop.run_in_executor(pool, cpu_bound_task, 10**7)
        print(result)

asyncio.run(main())

Таким образом, asyncio сам по себе не управляет CPU-bound задачами напрямую, а предоставляет интерфейс для их запуска в отдельных потоках или процессах через executors.

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

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

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

Подробнее