Python - ist time.sleep (n) CPU intensiv? [Duplikat]

7

Ich habe mit der Idee gespielt, time.sleep(n) in einem Python-Skript zu verwenden, damit es Jobs in verschiedenen Intervallen ausführt. Der Pseudocode würde wie folgt aussehen:

%Vor%

Kurz gesagt, das Programm schläft, bis der nächste Job ausgeführt werden muss. Er führt den Job aus, sucht den nächsten auszuführenden Job und schläft, bis der nächste Job ausgeführt werden muss (fährt bis ins Unendliche fort). Ich plane, dies auf einem Linux-Rechner auszuführen - die Verwendung eines Cron-Jobs ist eine Möglichkeit. Hat jemand Meinungen zu beiden?

    
SheerSt 12.06.2013, 21:35
quelle

2 Antworten

22

Nein, es ist nicht CPU-intensiv.

Die Dokumentation lautet:

  

Unterbrechen Sie die Ausführung für die angegebene Anzahl von Sekunden.

Python kann nicht wirklich garantieren, dass bei jeder möglichen Implementierung das Betriebssystem Ihren Prozess während eines Schlafs niemals planen wird. Aber auf jeder Plattform versucht Python, etwas angemessenes zu tun, um für die angegebene Zeit zu blockieren, ohne irgendeine CPU zu verwenden. Auf einigen Plattformen mag das noch ein bisschen CPU bedeuten, aber es wird so wenig wie möglich sein.

Insbesondere, da Sie nach Linux und vermutlich CPython gefragt haben:

Unter Linux und den meisten anderen POSIX-Plattformen wird normalerweise select verwendet. Siehe die 3.3 Quelle .

Die man-Seite macht es ziemlich klar, dass select bis zum Signal, Timeout oder Ready / O (und in diesem Fall gibt es keine fds, also ist letzteres unmöglich).

Sie können die Kernel-Quelle für alle Details lesen, aber im Grunde, wenn keine unerwarteten Signale vorliegen, werden Sie überhaupt nicht eingeplant, außer vielleicht eine kleine Menge von Spinnerei zu Beginn von select (wie eine Optimierung für die Fälle, in denen select fast sofort zurückkehren kann.

In der Mitte Ihrer Zusammenfassung ändert sich die Frage von "ist sleep CPU-intensiv" zu "Soll ich sleep oder einen Cron-Job verwenden?"

Wie auch immer, Sie brennen keine CPU, während Sie warten. Es gibt einige Vor-und Nachteile, aber die meisten von ihnen sind trivial. Von (grob und subjektiv) am wichtigsten bis mindestens, ein Cron Job:

  • ermöglicht die Konfiguration, z. B. das Ändern des Zeitplans, ohne den Quellcode zu bearbeiten.
  • erfordert die Konfiguration, um zu funktionieren.
  • bedeutet weniger Code-Bedeutung weniger Bugs und weniger für zukünftige Leser zu verstehen.
  • bleibt beim Herunterfahren des Systems bestehen.
  • wird erneut ausgelöst, auch wenn das Skript mit einer Ausnahme oder einem Signal beendet wird.
  • kann entweder 0, 1 oder N-mal feuern, wenn sein geplantes Intervall N-mal verfehlt wird (dies ist nicht spezifiziert, und verschiedene Cron-Implementierungen machen verschiedene Dinge), statt garantiert 0.
  • hat eine bessere Chance, Systemtaktänderungen zu verarbeiten.
  • muss jedes Mal, wenn es ausgelöst wird, für den Start des Prozesses, den Start des Interpreters usw. aufkommen.
  • verschwendet keine Seitentabellen- und Prozesstabellenbereiche, da kein Prozess läuft und kein Speicher zugeordnet ist.
abarnert 12.06.2013, 21:39
quelle
3

Nein, es ist nicht prozessorintensiv. Es lässt den Prozessor im Leerlauf.

Laut der Dokumentation wird die Ausführung ausgesetzt, was bedeutet, dass dies nicht der Fall ist Prozessorintensiv. Ein beschäftigtes Warten wäre prozessorintensiv.

    
coder543 12.06.2013 21:39
quelle

Tags und Links