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

Schreibe einen Kommentar