나는 이것을 사용하여 시간당 60 개의 이벤트를 발생시키고 대부분의 이벤트는 전체 분 후에 동일한 초 수에서 발생합니다.
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()
실제 조건에 따라 길이의 틱이 나타날 수 있습니다.
60,60,62,58,60,60,120,30,30,60,60,60,60,60...etc.
그러나 60 분이 지나면 60 개의 틱이 생깁니다. 대부분은 원하는 분에 대한 올바른 오프셋에서 발생합니다.
내 시스템에서 보정이 필요할 때까지 <1/20 초의 전형적인 드리프트를 얻습니다.
이 방법의 장점은 클럭 드리프트의 해상도입니다. 틱당 하나의 항목을 추가하는 것과 같은 작업을 수행하고 시간당 60 개의 항목이 추가되는 경우 문제가 발생할 수 있습니다. 드리프트를 설명하지 않으면 이동 평균과 같은 2 차 표시가 데이터를 너무 깊게 고려하여 출력이 잘못 될 수 있습니다.