Вопрос проверяет понимание GIL и различий между CPU-bound и IO-bound задачами.
Многопоточность в Python ограничена Global Interpreter Lock (GIL), который позволяет выполнять байткод только одному потоку одновременно. Поэтому CPU-bound задачи не получают реального параллелизма. Потоки полезны для IO-bound задач, где поток ожидает ввода-вывода. Для CPU-bound задач чаще используют multiprocessing.
В CPython существует механизм GIL — глобальная блокировка интерпретатора.
GIL — это механизм, который гарантирует, что в один момент времени байткод Python выполняет только один поток.
Если несколько потоков:
выполняют вычисления
активно используют CPU
то они:
конкурируют за GIL
часто переключаются
не выполняются параллельно
Это может даже замедлить программу.
Многопоточность полезна:
сетевые запросы
работа с файлами
ожидание ответа
Пример IO-bound:
# потоки ждут сеть, CPU свободен
Используют:
multiprocessing
C-расширения
NumPy
Пример multiprocessing:
from multiprocessing import Pool
Многопоточность в Python не ускоряет CPU-bound задачи из-за GIL. Для параллельных вычислений используется multiprocessing.