2010-07-12 8 views
9

in Python, wenn ich einen Prozess behalten wollen oder Gewinde immer läuft, kann ich tun dies in der Regel mit einem leeren while-Schleife:Nicht blockierende Warte in Python

while 1: 
    pass 

dies wird jedoch ein essen ungerechte Menge an CPU-Prozess. Hinzufügen eines kurzen Schlafes würde funktionieren

import time 
while 1: 
    time.sleep(0.01) 

Gibt es eine beste und sauberere Art, dies zu tun? Danke

+0

Worauf wartet der Thread? Warum machst du nicht time.sleep (1000000)? – Sjoerd

+0

es ist für eine serverähnliche Anwendung, also würde ich es für mehr als Tage (1000000 Sekunden) warten lassen! Theoretisch muss ein Thread, der _forever_ laufen soll, viel länger laufen als _eine sehr hohe Anzahl von Sekunden_ – pistacchio

+0

Ist der Thread * etwas Nützliches * anderes als Sleeping oder Busy-Looping? Wenn nicht, können Sie es einfach abschaffen? Und wenn es etwas Sinnvolles macht, dann mach 'es gut! Das ist das bisschen, was wir wissen müssen, um Ihnen zu helfen. –

Antwort

7

die eher bizarren Anforderungen (ein Prozess, der ohne viel CPU für immer geht) gegeben, dann ist dies recht kompakt:

import threading 
dummy_event = threading.Event() 
dummy_event.wait() 

... aber ich fürchte, dass ich die Versuchung erliegen bin Ihre Y zu lösen und nicht Ihr X.

Darüber hinaus wird dies nicht funktionieren, wenn Ihre Plattform das Modul threading nicht zur Verfügung stellt. Wenn Sie versuchen, das dummy_threading Modul zu ersetzen, kehrt dummy_event.wait() sofort zurück.

Update: wenn Sie nur einen übergeordneten Prozess zum Wohle seiner Teilprozesse gehen zu halten, können Sie die wait() Methode auf Popen objects oder die join() Methode auf Process Objekte verwenden. Beide Methoden werden unbegrenzt blockiert, bis der Subprozess beendet wird. Wenn Sie eine andere Subprozess-API verwenden, müssen entsprechende Funktionen verfügbar sein. Wenn nicht, holen Sie sich die PID des Prozesses und verwenden Sie os.waitpid().

2

Verwenden Sie nicht beschäftigt warten. Abhängig davon, worauf Sie warten, verwenden Sie eine der blockierenden Wartefunktionen des Betriebssystems, z. select unter Unix und WaitForSingleObject/WaitForMultipleObjects unter Windows.

+0

danke für die Antwort.Allerdings warte ich nicht auf etwas. Wie die Frage impliziert, ist das Prozessziel, _forever_ zu laufen, bis es getötet wird. – pistacchio

1

Wenn Sie sich auf dieses Skript zur periodischen Wartung verlassen, verwenden Sie Cron (UNIX) oder geplante Aufgaben (Windows).

Wenn Sie warten möchten, bis Unterprozesse abgeschlossen sind, verwenden Sie os.waitpid.

Wenn Sie auf Dateisystemaktivität warten möchten, verwenden Sie pyinotify.

2

Was ist das Problem mit dem Schlafen für eine sehr kurze Zeit? 1 Millisekunde ist für einen modernen Computer fast eine Ewigkeit. Vorausgesetzt, Sie haben nicht Tausende von diesen Threads (was es klingt wie Sie nicht), dann ist es nicht falsch mit Schlaf für eine, zehn, zehntausend oder zehn Millionen Millisekunden bei jeder Iteration durch die Schleife. Die CPU wird diesen kleinen Blip nicht einmal bemerken.

Verwandte Themen