2017-10-24 1 views
1

Ich habe eine Planungsfunktion und einen Scheduler mit einer Warteschlange von zukünftigen Ereignissen nach Zeit sortiert. Ich verwende UNIX-Zeitstempel und das reguläre time.time(). Ein Fragment des Planers entspricht in etwa folgendermaßen aus:Planung für eine genaue Zeit mit monotoner Zeit

# select the nearest event (eventfunc at eventime) 
sleeptime = eventtime - time.time() 
# if the sleep gets interrupted, 
# the whole block will be restarted 
interruptible_sleep(sleeptime) 
eventfunc() 

wo die eventtime berechnet entweder auf einer Verzögerung basieren könnte:

eventtime = time.time() + delay_seconds 

oder auf der Grundlage einer genauen Datum und Uhrzeit, zB:

eventtime = datetime(year,month,day,hour,min).timestamp() 

Jetzt haben wir die monotone Zeit in Python. Ich überlege, den Scheduler zu ändern, um die monotone Zeit zu verwenden. Scheduler sollen die monotone Zeit, die sie sagen, benutzen.

Kein Problem mit Verzögerungen:

sleeptime = eventtime - time.monotonic() 

wo:

eventtime = time.monotonic() + delay_seconds 

Aber mit der genauen Zeit denke ich, der beste Weg, um den Code zu lassen, wie es ist. Ist das korrekt?

Wenn ja, würde ich zwei Ereigniswarteschlangen benötigen, eine basierend auf monotoner Zeit und eine basierend auf regulärer Zeit. Ich mag diese Idee nicht besonders.

+0

Sie können sich das ['sched 'Standardmodul] (https://docs.python.org/3/library/sched.html) ansehen. Es ist so konzipiert, dass es unabhängig vom Zeitmanipulations-Backend ist und standardmäßig "time.monotonic" verwendet. –

Antwort

1

Wie ich im Kommentar sagte, dupliziert der Code die Funktionalität der sched standard module - so können Sie auch dieses Problem als eine bequeme Ausrede zu migrieren, um es zu lösen.

Das heißt,

  • was sollen Sie tun, wenn die Systemzeit vorwärts springt oder rückwärts ist aufgabenspezifisch.
  • time.monotonic() ist für Fälle konzipiert, wenn Sie Dinge tun müssen, um mit festgelegten Intervallen zwischen ihnen unabhängig von irgendetwas
  • Also, wenn Ihre Lösung erwartet wird, statt zu Zeit reagieren springt von geplanten Aufgaben früher oder höher ausgeführt wird, als es sonst würde, in Übereinstimmung mit der neuen Systemzeit, keinen Grund haben, monotone Zeit zu verwenden.

Wenn Sie beide tun wollen, dann müssen Sie entweder zwei Disponenten oder Aufgaben mit Zeitstempel der beiden Arten.

Im letzteren Fall muss der Scheduler einen Typ in den anderen konvertieren (jedes Mal, wenn er berechnet, wie lange gewartet/ob die nächste Aufgabe ausgeführt wird) - für die time keine Mittel bereitstellt.

+0

Mein Programm geht nur davon aus, dass NTP gut konfiguriert ist, d. H. Der Server hat die genaue Zeit ohne Sprünge. Es ist jedoch immer gut, eine robustere Lösung nur für den Fall zu haben. Deshalb untersuche ich die Vor- und Nachteile der monotonen Uhr. Du hast meine Frage nicht direkt beantwortet.Sind zwei Ereigniswarteschlangen erforderlich, um die monotone Uhr in einem Scheduler zu nutzen? Eine Warteschlange - für Verzögerungen, Intervalle usw. - arbeitet mit "time.monotonic" und einer anderen Warteschlange - für die genaue Zeitplanung - für die Arbeit mit 'time.time'? – VPfB

+0

siehe das Update. –