Почему поток работает медленнее, чем подпроцесс? когда я должен использовать подпроцесс вместо потока и наоборот - PullRequest
4 голосов
/ 21 июня 2011

В моем приложении я попытался запустить модуль python threading и subprocess, чтобы открыть firefox, и заметил, что подпроцесс работает быстрее, чем threading. что может быть причиной этого?

когда их использовать вместо друг друга?

1 Ответ

7 голосов
/ 21 июня 2011

Python (или, скорее, CPython, широко используемая реализация на основе c) имеет глобальную блокировку интерпретатора (также известную как GIL ).

Какой-то тип блокировки необходим для синхронизации доступа к памяти, когда несколько потоков обращаются к одной и той же памяти, что происходит внутри процесса.Память не распределяется между процессами (если вы специально не выделяете такую ​​память), поэтому блокировка там не требуется.

Глобальность блокировки не позволяет нескольким потокам запускать код Python в одном и том же процессе.При запуске многократных процессов GIL не вмешивается.

Итак, код Python не масштабируется в потоках, для этого нужны процессы.

Теперь, если ваш код Python в основном вызывал C-API (NumPy / OpenGL / и т. Д.), Будет происходить масштабирование, поскольку GIL обычно высвобождается при выполнении нативного кода, поэтому вполне нормально (и на самом деле хорошая идея) использовать Python для управления несколькими потоками, которые в основном исполняют нативный код.

(Существуют и другие реализации интерпретатора Python, которые масштабируются между потоками (например, Jython, IronPython и т. Д.), Но на самом деле они не являются массовыми ... пока, и обычно немного медленнее, чем CPython всценарии потока.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...