
Ich arbeite an einem gemeinsam genutzten Cluster. Ich habe Leute gesehen, die parallelisierten C-Code auf diesem Cluster ausführen. Wenn ich mir anschaue, top
welche Prozesse ausgeführt werden, zeigt sich, dass sie (zum Beispiel) 400 % der CPU nutzen, da sie vier Prozessoren für eine einzelne Instanz ihres Codes verwenden.
Jetzt führt jemand (wie ich höre) einen parallelisierten Python-Code aus. Allerdings wird nicht top
angezeigt, dass der Python-Code 400 % der CPU nutzt, sondern als vier verschiedene Prozesse, die jeweils ihren eigenen Prozessor (zu 100 %) nutzen.
Ich frage mich, ob Python (bei paralleler Ausführung) mit top
ebenso vielen laufenden verschiedenen Prozessen angezeigt wird (im Gegensatz zu C) oder ob dieser Python-Code nicht tatsächlich parallel ausgeführt wird.
Ich weiß nicht, ob Stack Exchange für diese Frage besser geeignet wäre. Da ich Stack Exchange verwende, top
dachte ich, dieser Ort wäre besser. Sagen Sie mir Bescheid, wenn ich es verschieben soll.
Antwort1
Was Sie in C sehen, ist die Verwendung von Threads, daher ist die Prozessauslastung die Summe aller Threads. Wenn es 4 Threads mit jeweils 100 % CPU-Auslastung gibt, wird der Prozess mit 400 % angezeigt.
Was Sie in Python sehen, ist mit ziemlicher Sicherheit Parallelität über das Multiprozessmodell. Das ist ein Modell, das die Threading-Einschränkungen von Python überwinden soll. Python kann sich selbst nur mit einem Thread gleichzeitig ausführen (siehe Python Global Interpreter Lock - GIL). Um das zu verbessern, können Sie das Multiprozessmodul verwenden, das letztendlich Prozesse anstelle von Threads erstellt, die wiederum in ps als mehrere Prozesse angezeigt werden, die dann jeweils bis zu 100 % der CPU-Leistung nutzen können, da sie (jeder) Single-Threaded sind.
Ich wette, wenn Sie es ausführen, ps -afeT
sehen Sie die Threads des C-Programms, aber keine zusätzlichen Threads für das Python-Programm.
Antwort2
Die Python-Referenzimplementierung CPython verfügt über den Global Interpreter Lock (GIL), der verhindert, dass Code ausgeführt wird inparallel, nurgleichzeitig. Threading ist nur für I/O nützlich. Sie benötigen mehrere Prozesse, die parallel ausgeführt werden können. Der C-Code, den Sie betrachten, verwendet wahrscheinlich stattdessen Threading für Parallelität.