Ich muss mein Python-Programm für immer in einer Endlosschleife ausführen.
Derzeit leite ich es so -
#!/usr/bin/python
import time
# some python code that I want
# to keep on running
# Is this the right way to run the python program forever?
# And do I even need this time.sleep call?
while True:
time.sleep(5)
Gibt es einen besseren Weg, dies zu tun? Oder brauche ich überhaupt einen time.sleep
Anruf? Irgendwelche Gedanken?
python
infinite-loop
Alan W. Smith
quelle
quelle
time.sleep(5)
, solange Sie einen Code unter derwhile True:
Zeile eingerückt haben (es kann nurpass
ein Minimum sein)Antworten:
Ja, Sie können eine
while True:
Schleife verwenden, die niemals unterbrochen wird, um Python-Code kontinuierlich auszuführen.Sie müssen jedoch den Code, den Sie kontinuierlich ausführen möchten, in die Schleife einfügen :
#!/usr/bin/python while True: # some python code that I want # to keep on running
Wird auch
time.sleep
verwendet, um den Betrieb eines Skripts für einen bestimmten Zeitraum anzuhalten. Da Sie also möchten, dass Ihre kontinuierlich ausgeführt werden, verstehe ich nicht, warum Sie sie verwenden würden.quelle
time.sleep
die Leistung verbessert werden, indem beispielsweise 1 ms gewartet wird, anstatt mit maximaler Geschwindigkeit zu laufen?Wie wäre es mit diesem?
import signal signal.pause()
Dadurch wird Ihr Programm in den Ruhezustand versetzt, bis es ein Signal von einem anderen Prozess (oder von sich selbst in einem anderen Thread) empfängt und es weiß, dass es Zeit ist, etwas zu tun.
quelle
Schlaf ist ein guter Weg, um eine Überlastung der CPU zu vermeiden
Ich bin mir nicht sicher, ob es wirklich klug ist, aber ich benutze es normalerweise
while(not sleep(5)): #code to execute
Die Schlafmethode gibt immer None zurück.
quelle
Ich weiß, dass dies ein zu alter Thread ist, aber warum hat das niemand erwähnt?
#!/usr/bin/python3 import asyncio loop = asyncio.get_event_loop() try: loop.run_forever() finally: loop.close()
quelle
für Betriebssysteme, die Folgendes unterstützen
select
:import select # your code select.select([], [], [])
quelle
Hier ist die vollständige Syntax:
#!/usr/bin/python3 import time def your_function(): print("Hello, World") while True: your_function() time.sleep(10) #make function to sleep for 10 seconds
quelle
Ich habe ein kleines Skript interruptableloop.py , das den Code in einem Intervall (Standard 1 Sek.) Ausführt, während der Ausführung eine Nachricht auf den Bildschirm pumpt und ein Interrupt-Signal abfängt, das Sie mit CTL-C senden können:
#!/usr/bin/python3 from interruptableLoop import InterruptableLoop loop=InterruptableLoop(intervalSecs=1) # redundant argument while loop.ShouldContinue(): # some python code that I want # to keep on running pass
Wenn Sie das Skript ausführen und dann unterbrechen, sehen Sie diese Ausgabe (die Perioden werden bei jedem Durchlauf der Schleife abgepumpt):
[py36]$ ./interruptexample.py CTL-C to stop (or $kill -s SIGINT pid) ......^C Exiting at 2018-07-28 14:58:40.359331
InterruptableLoop.py :
""" Use to create a permanent loop that can be stopped ... ... from same terminal where process was started and is running in foreground: CTL-C ... from same user account but through a different terminal $ kill -2 <pid> or $ kill -s SIGINT <pid> """ import signal import time from datetime import datetime as dtt __all__=["InterruptableLoop",] class InterruptableLoop: def __init__(self,intervalSecs=1,printStatus=True): self.intervalSecs=intervalSecs self.shouldContinue=True self.printStatus=printStatus self.interrupted=False if self.printStatus: print ("CTL-C to stop\t(or $kill -s SIGINT pid)") signal.signal(signal.SIGINT, self._StopRunning) signal.signal(signal.SIGQUIT, self._Abort) signal.signal(signal.SIGTERM, self._Abort) def _StopRunning(self, signal, frame): self.shouldContinue = False def _Abort(self, signal, frame): raise def ShouldContinue(self): time.sleep(self.intervalSecs) if self.shouldContinue and self.printStatus: print( ".",end="",flush=True) elif not self.shouldContinue and self.printStatus: print ("Exiting at ",dtt.now()) return self.shouldContinue
quelle
KeyboardInterrupt
undSystemExit
Ausnahmen im Client-Code abzufangen , als eine eigene Klasse dafür zu haben?