Bunu, tüm dakikalardan sonra aynı sayıda saniyede gerçekleşen çoğu olayla saatte 60 olaya neden olmak için kullanıyorum:
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()
Gerçek koşullara bağlı olarak uzunluk keneleri alabilirsiniz:
60,60,62,58,60,60,120,30,30,60,60,60,60,60...etc.
ama 60 dakikanın sonunda 60 keneniz olacak; ve çoğu tercih ettiğiniz dakikaya kadar doğru ofsette gerçekleşir.
Sistemimde düzeltme ihtiyacı ortaya çıkana kadar saniyenin 1 / 20'sinden az sapması oluyor.
Bu yöntemin avantajı, saat kaymasının çözümlenmesidir; kene başına bir öğe eklemek gibi bir şey yapıyorsanız ve saat başına 60 öğe eklenmesini beklerseniz sorunlara neden olabilir. Kaymayı hesaba katmamak, hareketli ortalamalar gibi ikincil göstergelerin verileri geçmişin çok derinlerinde değerlendirmesine neden olarak hatalı çıktıya neden olabilir.