timer-interrupt Threads in python
Ich habe versucht, eine genaue timer in python, oder wie präzise ein OS ermöglicht. Aber Es scheint, als komplizierter, als ich zunächst dachte.
Dies ist, wie ich es möchte, um zu arbeiten:
from time import sleep
from threading import Timer
def do_this():
print ("hello, world")
t = Timer(4, do_this)
t.start()
sleep(20)
t.cancel()
Wo während 20 Sekunden möchte ich ausführen 'do_this' jede vierte Sekunde. Allerdings 'do_this' einmal ausgeführt, dann wird das Skript beendet sich nach 20 Sekunden.
Andere Möglichkeit wäre ein thred mit einer while-Schleife.
import time
import threading
import datetime
shutdown_event = threading.Event()
def dowork():
while not shutdown_event.is_set():
print(datetime.datetime.now())
time.sleep(1.0)
def main():
t = threading.Thread(target=dowork, args=(), name='worker')
t.start()
print("Instance started")
try:
while t.isAlive():
t.join(timeout=1.0)
except (KeyboardInterrupt, SystemExit):
shutdown_event.set()
pass
if __name__ == '__main__':
main()
Diesem thread führt, wie erwartet, aber ich bekomme timing-drift. Ich habe in diesem Fall einen Ausgleich für die Zeit, die es braucht, um führen Sie den code in der while-Schleife durch die Anpassung der Schlaf entsprechend.
Gibt es eine einfache Möglichkeit in python zum ausführen einer timer jede Sekunde (oder ein Intervall) ohne die Einführung einer drift im Vergleich zu dem system, ohne Zeit zu kompensieren, die sleep(n) parameter?
Danke für die Hilfe,
/Anders
InformationsquelleAutor Anders Cedronius | 2013-05-06
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn
dowork()
läuft immer in weniger Zeit, als Sie Ihre Intervalle, können Sie erzeugen ein neues thread alle 4 Sekunden in einer Schleife:Wenn
dowork()
könnte möglicherweise führen Sie für mehr als 4 Sekunden, dann in deiner main-Schleife Sie wollen, stellen Sie sicher, dass der Vorherige Auftrag abgeschlossen ist, bevor Sie laichen eine neue.Jedoch
time.sleep()
kann selbst Driften, weil keine Garantien gemacht werden, wie lange der thread wird tatsächlich angehalten werden. Die richtige Weg, es zu tun wäre, um herauszufinden, wie lange der job gedauert und schlafen für den Rest des Intervalls. Ich denke, das ist, wie UI und game-rendering-engines arbeiten, wo Sie haben, um Anzeige Feste Anzahl von frames pro Sekunde zu festen Zeiten und rendering wird jeder frame könnte die unterschiedliche Länge der Zeit, die zum abschließen.InformationsquelleAutor Mansour