Этот вопрос проверяет понимание типов нагрузки и умение выбирать правильный подход к параллелизму и оптимизации.
I/O-bound задачи ограничены скоростью ввода-вывода: сеть, диск, база данных. CPU-bound задачи упираются в вычисления и загрузку процессора. Для I/O-bound задач хорошо подходит асинхронность и многопоточность, а для CPU-bound — распараллеливание по процессам. Неправильный выбор подхода приводит к потере производительности.
Перед оптимизацией важно понять, что именно ограничивает выполнение задачи: ожидание данных или вычисления.
I/O-bound task — задача, основное время которой уходит на ожидание операций ввода-вывода.CPU-bound task — задача, основное время которой уходит на вычисления.
Такие задачи:
часто ждут ответа;
простаивают, пока выполняется I/O.
Примеры:
HTTP-запросы к внешним сервисам;
запросы к БД;
чтение и запись файлов.
Почему асинхронность помогает:
пока одна операция ждёт I/O, CPU может выполнять другую.
Такие задачи:
постоянно загружают процессор;
почти не ждут внешних ресурсов.
Примеры:
обработка изображений;
шифрование;
сложные математические вычисления.
Особенность Python:
GIL мешает эффективно использовать CPU в потоках;
поэтому применяют multiprocessing.
Обычно:
async/await, event loop → I/O-bound;
multiprocessing → CPU-bound;
threading → I/O-bound (с блокирующими библиотеками).
Оптимизация начинается с классификации задачи. Асинхронность ускоряет I/O-bound задачи, а CPU-bound требуют параллелизма на уровне процессов.