Для тяжёлого Python-кода в обычной сборке CPython с GIL часто используют процессы, например ProcessPoolExecutor. Они выполняются в отдельных интерпретаторах и могут загрузить несколько ядер.
Если есть тяжёлые CPU-операции (математические вычисления), что лучше использовать вместо потоков?
Для тяжёлого Python-кода в обычной сборке CPython с GIL часто используют процессы, например ProcessPoolExecutor. Они выполняются в отдельных интерпретаторах и могут загрузить несколько ядер.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Для тяжёлого Python-кода в обычной сборке CPython с GIL часто используют процессы, например ProcessPoolExecutor. Они выполняются в отдельных интерпретаторах и могут загрузить несколько ядер.
Цена — запуск процессов, сериализация аргументов и передача результатов. Поэтому слишком мелкие задачи выгоднее объединять. Если вычисления выполняет нативная библиотека, освобождающая GIL, потоки могут оказаться эффективными; отдельный вариант — векторизация или GPU. Free-threaded сборки меняют ограничения, но требуют проверки совместимости. Выбор делают по профилю нагрузки и измерениям, а не по правилу «CPU всегда только процессы».