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?
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
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Lösung hängt davon ab, was Sie tun möchten. Hier sind ein paar Optionen:
Niedrigere Prioritäten von Prozessen
Können Sie
nice
der Teilprozesse. Diese Art ist, obwohl Sie noch Essen 100% von der CPU, wenn Sie andere Anwendungen starten, die OS den Vorzug gibt andere Anwendungen. Wenn Sie möchten, zu verlassen, eine Arbeit, die intensive Berechnungen laufen auf dem hintergrund von Ihrem laptop und kümmern sich nicht um den CPU-Lüfter die ganze Zeit laufen, dann wird der nice-Wert mitpsutils
ist Ihre Lösung. Dieses Skript ist ein test-Skript, das läuft auf allen Kernen für genügend Zeit, damit Sie sehen können, wie es sich verhält.Der trick ist, dass
limit_cpu
ist, führen am Anfang jedes Prozesses (sieheInitialisierung
argment in der doc). In der Erwägung, dass Unix hat Ebenen -19 (höchste prio) bis 19 (niedrigste prio), Windows hat ein paar verschiedene Ebenen für den Vorrang erhalten.BELOW_NORMAL_PRIORITY_CLASS
wahrscheinlich passt Ihre Anforderungen am besten, es ist auchIDLE_PRIORITY_CLASS
was sagt Windows, um Ihre Geschäftsprozesse nur, wenn das system im Leerlauf ist.Können Sie die Priorität, wenn Sie wechseln zu detail-Modus in den Task-Manager und der rechten Maustaste auf den Prozess:
Geringere Anzahl von Prozessen
Obwohl Sie es abgelehnt haben diese option möglicherweise eine gute option sein: Sagen Sie limitieren die Anzahl der Teilprozesse, die der Hälfte der cpu-Kerne, die mit
pool = Pool(max(cpu_count()//2, 1))
dann das OS läuft zunächst diejenigen Prozesse, die auf die Hälfte der cpu-Kerne, während die anderen bleiben im Leerlauf, oder führen Sie einfach die anderen Anwendungen, die derzeit ausgeführt werden. Nach einer kurzen Zeit, die OS terminiert die Prozesse und möglicherweise verschieben Sie Sie auf andere cpu-Kerne etc. Sowohl Windows-als Unix-basierte Systeme auf diese Weise Verhalten.Windows: Laufen 2 Prozesse auf 4 Kerne:
OSX: Laufen 4 Prozesse auf 8 Kerne:
Sehen Sie, dass beide OS-balance-Prozess zwischen den Kernen, wenn auch nicht gleichmäßig, so sehen Sie noch ein paar Kerne mit höheren Prozentzahlen als andere.
Schlafen
Wenn Sie unbedingt wollen, gehen Sie sicher, dass Ihre Prozesse nie Essen 100% von einem bestimmten Kern (z.B. wenn Sie verhindern möchten, dass der cpu-Lüfter geht nach oben), dann können Sie schlafen in Ihrer Verarbeitung-Funktion:
Das macht das OS "Zeitplan aus" Ihren Prozess für
0.01
Sekunden für jede Berechnung und macht Platz für andere Anwendungen. Wenn es keine anderen Anwendungen, die cpu-Kern inaktiv ist, so wird es nie zu 100%. Sie müssen spielen, um mit verschiedenen Schlaf-Dauer, es wird auch variieren von computer zu computer führen Sie es auf. Wenn Sie wollen, machen es sehr anspruchsvoll Sie sich den Schlaf-je nachdem, wascpu_times()
berichten.Ich hatte noch keine Zeit zu Graben, in die windows-Implementierung, aber es sieht aus wie
p.nice(psutil.BELOW_NORMAL_PRIORITY_CLASS)
wäre, was Sie wollen.schnelle Antwort: psutil verspricht die gleiche Arbeit unter Windows, wenn ich einige Minuten check ich auf Windows auch, aber ich erwarte, dass es anders sein nur kleine details
danke für den input. In der Tat
p.nice(19)
funktioniert nicht auf Windows, wie Windows arbeitet mit diesen verschiedenen Ebenenvielen Dank für diese äußerst informative Antwort!
InformationsquelleAutor hansaplast
Auf OS-Ebene
können Sie
nice
zum festlegen einer Priorität zu einem einzigen Befehl. Sie können auch beginnen, ein python-Skript mit netten. (Unten von: http://blog.scoutapp.com/articles/2014/11/04/restricting-process-cpu-usage-using-nice-cpulimit-and-cgroups)Als eine Funktion in Python
Ein weiterer Ansatz ist die Verwendung psutils, um überprüfen Sie Ihre CPU-Last Durchschnitt der letzten minute und dann haben deine threads überprüfen Sie die CPU-load Durchschnitt und die Spule, bis ein anderer thread, wenn Sie unter den angegebenen CPU-Last target und schlafen oder zu töten, den thread, wenn du über die CPU-Last target. Diese erhalten aus dem Weg wenn Sie mit Ihrem computer, behält aber eine Konstante CPU-Last.
InformationsquelleAutor rippledj