1

Ich schreibe ein Python 2.7.11 Programm unter Linux. Das Programm erstellt 12 Teilprozesse mit Multiprocessing.Pool. Jeder Unterprozess hat CPU-Affinität mit einem der 12 CPUs über die Psutil-Bibliothek für Python.Mischen Threading von c-Funktion mit Python Multiprozessing

Ich benutze multiprocessing.Event 11 Teilprozesse für Unterprozess 0.

Dann warten, um in Teilprozesse 0, nenne ich Math Kernel Bibliothek Intel eine Berechnung mit 12 Threads zu starten.

Werden die wartenden Subprozesse irgendwelche CPU-Ressourcen verbrauchen und die Berechnung durch die 12 Threads beeinflussen?

Wenn ja, wie kann man das vermeiden? Oder wie testen, ob das passiert?

Beeinflusst der Hauptprozess die Berechnung durch die 12 Threads?

Danke.

+0

Allgemein gesagt, nein. Unter der Annahme, dass das Betriebssystem die Prozesse einzelnen Kernen/Prozessoren im System zuweist, sollte man keine anderen bewirken. Mangels Details ist es schwierig, genauer zu sein. Können Sie Beispielcode posten? – codingCat

+0

Die 12 Unterprozesse beeinflussen sich nicht gegenseitig. Aber werden die "wartenden" 12 Subprozesse die 12 Threads beeinflussen, die von intel's mkl vom Subprozess 0 gestartet werden? Es gibt nur 12 CPUs .... ich kann versuchen, eine vereinfachte Version des Codes auszuarbeiten. das ganze, einschließlich der ctypes python numpy und intel mkl zu interface ist ziemlich lang. – rxu

Antwort

1

Okay, habe ich eine wenig Forschung und ...

Erstens, da die 12 Fäden in einem einzigen Prozess sind, was passiert in den anderen Teilprozessen sollte nicht den übergeordneten Prozess bewirkt in irgendeiner Weise . Es gibt einige Hintergrundverarbeitungen, die vom Betriebssystem ausgeführt werden, um Interprozesskommunikation zu verarbeiten, die in dem Prozess stattfinden wird, in dem der Betriebssystemkern ist, vermutlich der Elternprozess (Prozess 0). Dies ist jedoch sehr gering und sollte nicht durch Aktivitäten in anderen Prozessen beeinflusst werden.

Mit anderen Worten, schwere Aktivität in einem Prozess sollte keinen anderen Prozess beeinflussen.

Ich würde zwei Dinge vorschlagen.

1) Fügen Sie einen weiteren Prozess hinzu, aus dem Ihre 12 Threads gestartet werden. Dadurch wird es vom übergeordneten Thread getrennt, in dem sich das Betriebssystem befindet.

2) Führen Sie eigene Tests durch. Setzen Sie eine Variable am Anfang jedes Threads mit dem aktuellen Millisekunden-Timer. Überprüfen Sie am Ende der Verarbeitung, wie lange es gedauert hat. Lassen Sie dann die anderen Prozesse sinnlose Gleitkommaberechnungen durchführen und sehen Sie, ob sich dies auf die durchschnittliche Laufzeit der Threads auswirkt.

Wenn Sie etwas über das Time Modul, das Multiprocessing Modul und das Threading Modul nachforschen, sollten Sie das Thema für Sie klären.