Вопрос проверяет знание способов вынесения тяжёлых вычислений из основного потока, чтобы не блокировать приложение.
Тяжёлые операции выносят в отдельные процессы или очереди задач. В Python для этого используют multiprocessing, ProcessPoolExecutor, Celery, RQ или другие task-менеджеры. Асинхронность не помогает для CPU-нагрузки из-за GIL, поэтому процессы предпочтительнее. Очереди сообщений позволяют распределять тяжёлые задачи между несколькими воркерами. Такой подход обеспечивает отзывчивость основного приложения и горизонтальное масштабирование.
Основная цель — разгрузить главный поток и не блокировать ввод-вывод для пользователей.
Определение:
CPU-bound задача — это задача, основная сложность которой — вычисления, а не ввод-вывод.
Проблемы при выполнении таких задач в основном потоке:
приложение перестаёт отвечать;
event loop (asyncio) полностью блокируется;
GIL ограничивает многопоточность.
multiprocessing)Каждый процесс имеет свой GIL.
Python
from multiprocessing import Pool
def resize(image):
# тяжёлая операция
return process_image(image)
with Pool(4) as pool:
results = pool.map(resize, images)
Плюсы:
реальное параллельное выполнение;
идеально для CPU-heavy задач.
Минусы:
накладные расходы на передачу больших данных между процессами.
ProcessPoolExecutorУдобная обёртка поверх процессов.
Python
import asyncio
from concurrent.futures import ProcessPoolExecutor
executor = ProcessPoolExecutor()
async def main():
loop = asyncio.get_running_loop()
result = await loop.run_in_executor(executor, heavy_task)
Хорошо сочетается с asyncio.
Используются, когда:
нужно асинхронное выполнение;
требуется обработка множества задач;
важна надёжность и масштабируемость.
Примеры:
Celery (RabbitMQ/Redis)
RQ (Redis)
Huey
Dramatiq
Задачи помещаются в очередь, воркеры обрабатывают их независимо от веб-приложения.
Иногда тяжёлые операции выносят в отдельный сервис:
главный сервис отправляет запрос;
сервис-воркер выполняет задачу;
результат возвращается или сохраняется в БД.
Обработка изображений — процессы или выделенные сервисы.
Видео/аудио — специализированные воркеры или отдельные машины с GPU.
Большие файлы — chunk-подход и вынесение в pipeline (S3 → воркер → БД).
Для тяжёлых операций используют процессы или очереди задач, так как такие задачи блокируют основной поток и не работают эффективно с GIL. Вынесение вычислений делает приложение стабильным, быстрым и масштабируемым.