Python (или, скорее, CPython, широко используемая реализация на основе c) имеет глобальную блокировку интерпретатора (также известную как GIL ).
Какой-то тип блокировки необходим для синхронизации доступа к памяти, когда несколько потоков обращаются к одной и той же памяти, что происходит внутри процесса.Память не распределяется между процессами (если вы специально не выделяете такую память), поэтому блокировка там не требуется.
Глобальность блокировки не позволяет нескольким потокам запускать код Python в одном и том же процессе.При запуске многократных процессов GIL не вмешивается.
Итак, код Python не масштабируется в потоках, для этого нужны процессы.
Теперь, если ваш код Python в основном вызывал C-API (NumPy / OpenGL / и т. Д.), Будет происходить масштабирование, поскольку GIL обычно высвобождается при выполнении нативного кода, поэтому вполне нормально (и на самом деле хорошая идея) использовать Python для управления несколькими потоками, которые в основном исполняют нативный код.
(Существуют и другие реализации интерпретатора Python, которые масштабируются между потоками (например, Jython, IronPython и т. Д.), Но на самом деле они не являются массовыми ... пока, и обычно немного медленнее, чем CPython всценарии потока.)