Maximale CPU-Verwendung in python-multiprocessing

Ich bin mit multiprocessing.Pool.imap laufen viele unabhängige jobs, die parallel mit Python 2.7 unter Windows 7. Mit den Standard-Einstellungen, meine gesamte CPU-Nutzung gebunden ist bei 100%, wie gemessen durch den Windows Task-Manager. Dies macht es unmöglich, zu tun, alle anderen arbeiten, während mein code läuft im hintergrund.

Habe ich versucht, die Begrenzung der Anzahl der Prozesse die Anzahl der CPUs minus 1, wie beschrieben in Wie beschränken Sie die Anzahl der Prozessoren, die Python verwendet:

pool = Pool(processes=max(multiprocessing.cpu_count()-1, 1)
for p in pool.imap(func, iterable):
     ...

Das reduziert die Gesamtzahl der Laufenden Prozesse. Jedoch, jeder Prozess dauert nur mehr Zyklen machen. Also meine gesamte CPU-Auslastung ist immer noch abgesteckt bei 100%.

Gibt es eine Möglichkeit, direkt zu beschränken, die Gesamt-CPU-Auslastung - NICHT nur die Zahl der Prozesse - oder, ansonsten, gibt es Abhilfe?

Entfernen 1 Kern ist nicht genug. Wegen der GIL, python verbraucht nur 1 core im Wert von Bearbeitungszeit, es sei denn, Sie tun etwas, das Gewinde außerhalb der GIL in einem Modul (z.B. numpy) oder Teilprozesse. Aber der wichtigste Prozess kann nicht vollständig im Leerlauf und Windows selbst ist so etwas wie ein hog. Je nachdem, was, was dein code tut, und dem, was sonst auf dem system ausgeführt wird, 2/3 der CPUs wird wahrscheinlich max.
Sie können niedriger Prozess Priorität win32-tools (Beispiel) oder mit psutil Process.nice. Sie erhalten weiterhin 100% Auslastung, aber weniger aufdringlich. Sie wollen immer noch weniger als alle Kerne.
danke, das sind hilfreiche Tipps! Wenn Sie Lust haben, buchen Sie ein code-Beispiel, das verbindet pool und psutil, dass wäre sicher eine tolle Antwort auf die Frage!

InformationsquelleAutor Dave Kielpinski | 2017-02-08

Schreibe einen Kommentar