Как выглядит распараллеленная программа Python с командой top?

Как выглядит распараллеленная программа Python с командой top?

Я работаю на общем кластере. Я видел, как люди запускали параллельный код на C на этом кластере, и когда я использовал его, topчтобы посмотреть, какие процессы запущены, было показано, что они используют (например) 400% ЦП, поскольку они используют четыре процессора для одного экземпляра своего кода.

Сейчас кто-то запускает (как я слышал) распараллеленный код Python. Однако вместо того, чтобы topпоказать, что код Python использует 400% процессора, он отображается как четыре разных процесса, каждый из которых использует свой процессор (на 100%).

Мне интересно, показывает ли Python (при распараллеливании) topстолько же запущенных различных процессов (в отличие от C) или этот код Python на самом деле не выполняется параллельно?

Не знаю, будет ли Stack Exchange лучшим местом для этого вопроса. Поскольку я использую, topя подумал, что это место будет лучше. Дайте мне знать, если мне следует переместить его.

решение1

То, что вы видите в C, это использование потоков, поэтому использование процесса является суммой всех его потоков. Если есть 4 потока с 100% использованием ЦП каждый, процесс будет отображаться как 400%

То, что вы видите в python, почти наверняка является параллелизмом через модель multiprocess. Это модель, призванная преодолеть ограничения потоков Python. Python может запускать только один поток за раз (см. Python Global Interpreter Lock - GIL). Чтобы добиться большего, можно использовать модуль multiprocess, который в итоге создает процессы вместо потоков, которые, в свою очередь, отображаются в ps как несколько процессов, которые затем могут использовать до 100% CPU каждый, поскольку они (каждый) однопоточные.

Держу пари, что если вы запустите, ps -afeTто увидите потоки программы на языке C, но никаких дополнительных потоков для программы на языке Python.

решение2

Реализованная реализация Python, CPython, имеет глобальную блокировку интерпретатора (GIL), которая не позволяет ей запускать код впараллельный, толькоодновременно. Потоки полезны только для ввода-вывода. Вам нужно несколько процессов, чтобы иметь возможность выполняться параллельно. Код C, который вы смотрите, скорее всего, использует потоки для параллелизма.

Связанный контент