Wie kann ich die CPU-Auslastung für dieses Python-Programm senken?

15

Ich werde Python 24/7 in einer while-Schleife ausführen lassen. Hier ist ein Beispiel für diese Art von Programm:

while True:

    print ("me again...")

Aber wenn ich es laufen lasse, geht meine CPU zu 100%! Aber ich möchte das nicht, da mein Programm sehr lange läuft, und ich möchte nicht, dass meine CPU sehr heiß wird. Kann ich das trotzdem verhindern?

user151324
quelle
3
Ohne Wartezeit geht die CPU zu 100% aus, weil Sie dies so angeordnet haben :) Drucken Sie so schnell wie möglich. Warten hilft also, diese Last abzuladen. Druck ist im Allgemeinen eine sehr teure Operation. Schreiben in eine Datei ist viel billiger.
Piotr Kula
Sie müssen dem Betriebssystem mitteilen, dass Sie für einen bestimmten Zeitraum keine CPU-Zyklen möchten, andernfalls können Sie nichts tun, um das zu vermeiden, was Sie sehen.
Thorbjørn Ravn Andersen

Antworten:

16

Am Ende Ihrer Schleife haben Sie eine

time.sleep(xx)für Sekunden oder time.sleep(x.x)für Teilsekunden

(Bitte denken Sie daran , die Bibliothek zu importieren, etwa so: import time)

Wenn xx so hoch wie möglich ist, ohne Ihr Programm zu beeinträchtigen. Im Moment macht Ihr Programm immer alles so schnell wie möglich, anstatt dem Pi etwas Zeit zu geben, um sich auszuruhen oder etwas anderes zu tun.

Butters
quelle
Hmmmm ... Sehr interessant ... ich werde es ausprobieren. Vielen Dank! Kann nicht glauben, dass ich nicht daran gedacht habe!
user151324
Gibt es eine Bibliothek, die ich importieren soll usw.? Ich
erhalte die
@coding_corgi ja, du brauchst die zeitbibliothek.
Butters
2
Also import time?
user151324
@coding_corgi. Ja, das ist richtig.
Butters
14

Vorwort

Stellen Sie sicher, dass Sie Ihre Aufgabe wirklich wiederholt ausführen müssen. Dies nennt man beschäftigt warten und fast immer suboptimal. Wenn Ihre Aufgabe auf die Ausgabe eines Unterprozesses prüft, können Sie ihn beispielsweise einfach abschließen lassen subprocess.wait(). Wenn Sie darauf warten müssen, dass eine Datei oder ein Verzeichnis im Dateisystem berührt wird, können Sie pyinotify verwenden , um Ihren Code vom Dateisystemereignis auszulösen , das vom Kernel behandelt wird.

Antworten

Auf diese Weise schreiben Sie eine Endlosschleife, um zu warten, ohne zu viel CPU zu verbrauchen.

Python 2:

from __future__ import print_function
from __future__ import division

import time

while True:
    range(10000)       # some payload code
    print("Me again")  # some console logging
    time.sleep(0.2)    # sane sleep time of 0.1 seconds

Python 3:

import time

while True:
    range(10000)       # some payload code
    print("Me again")  # some console logging
    time.sleep(0.2)    # sane sleep time of 0.1 seconds

Auswertung

Wie @gnibbler in einer anderen Antwort getestet hat , sollte der vorgestellte Code auf neueren Computern nicht mehr als 1% CPU verbrauchen. Wenn es mit Ihrem Nutzlastcode immer noch zu viel CPU verbraucht, sollten Sie die Ruhezeit noch weiter erhöhen. Andererseits muss der Payload-Code möglicherweise für die wiederholte Ausführung optimiert werden. Das Caching kann beispielsweise die Ausführung bei unveränderten Daten beschleunigen.

Credits

Diese Antwort baut auf der Antwort von @ user2301728 auf .

Bengt
quelle
3

Ich hatte das gleiche Problem, siehe meine Frage zu Stack Exchange . Die Lösung war eine Kombination von time.sleep(0.01)und nice. niceSenkt die für eine Anwendung verfügbare CPU. Dies ist , wie ich die app starten: nice -n 19.

dotancohen
quelle
1

Sie könnten es auch versuchen nice -n 19 python myscript.py.

nice ist ein * nix-Dienstprogramm zum Festlegen der CPU-Priorität einer Task. 19 ist das größte Gewicht und folglich die langsamste Einstellung.

CyberSkull
quelle
2
Nein. Das Erhöhen der Feinheit eines Prozesses hilft nur, indem andere Prozesse die CPUs häufiger abrufen können. In jedem Moment, in dem es keine anderen Prozesse gibt, wird der OP-Code immer noch 100% der CPU verwenden, und wenn dies der Fall ist, wird die CPU verwendet, was wiederum 100% entspricht.
Bengt