Ich benutze dies, um 60 Ereignisse pro Stunde zu verursachen, wobei die meisten Ereignisse nach der ganzen Minute in der gleichen Anzahl von Sekunden auftreten:
import math
import time
import random
TICK = 60 # one minute tick size
TICK_TIMING = 59 # execute on 59th second of the tick
TICK_MINIMUM = 30 # minimum catch up tick size when lagging
def set_timing():
now = time.time()
elapsed = now - info['begin']
minutes = math.floor(elapsed/TICK)
tick_elapsed = now - info['completion_time']
if (info['tick']+1) > minutes:
wait = max(0,(TICK_TIMING-(time.time() % TICK)))
print ('standard wait: %.2f' % wait)
time.sleep(wait)
elif tick_elapsed < TICK_MINIMUM:
wait = TICK_MINIMUM-tick_elapsed
print ('minimum wait: %.2f' % wait)
time.sleep(wait)
else:
print ('skip set_timing(); no wait')
drift = ((time.time() - info['begin']) - info['tick']*TICK -
TICK_TIMING + info['begin']%TICK)
print ('drift: %.6f' % drift)
info['tick'] = 0
info['begin'] = time.time()
info['completion_time'] = info['begin'] - TICK
while 1:
set_timing()
print('hello world')
#random real world event
time.sleep(random.random()*TICK_MINIMUM)
info['tick'] += 1
info['completion_time'] = time.time()
Abhängig von den tatsächlichen Bedingungen können Zecken mit einer Länge von:
60,60,62,58,60,60,120,30,30,60,60,60,60,60...etc.
Aber nach 60 Minuten haben Sie 60 Zecken. und die meisten von ihnen treten mit dem richtigen Versatz zu der Minute auf, die Sie bevorzugen.
Auf meinem System erhalte ich eine typische Drift von <1/20 Sekunde, bis Korrekturbedarf besteht.
Der Vorteil dieser Methode ist die Auflösung der Taktdrift; Dies kann zu Problemen führen, wenn Sie beispielsweise einen Artikel pro Tick anhängen und 60 Artikel pro Stunde anhängen. Wenn die Drift nicht berücksichtigt wird, können sekundäre Anzeigen wie gleitende Durchschnitte dazu führen, dass Daten zu tief in der Vergangenheit liegen, was zu einer fehlerhaften Ausgabe führt.