Tôi sử dụng điều này để gây ra 60 sự kiện mỗi giờ với hầu hết các sự kiện xảy ra ở cùng một số giây sau toàn bộ phút:
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()
Tùy thuộc vào điều kiện thực tế, bạn có thể nhận được dấu vết của chiều dài:
60,60,62,58,60,60,120,30,30,60,60,60,60,60...etc.
nhưng cuối 60 phút bạn sẽ có 60 tích tắc; và hầu hết trong số chúng sẽ xảy ra ở độ lệch chính xác đến phút bạn thích.
Trên hệ thống của tôi, tôi nhận được độ trôi điển hình <1/20 của giây cho đến khi cần điều chỉnh.
Ưu điểm của phương pháp này là độ phân giải của đồng hồ trôi; điều này có thể gây ra vấn đề nếu bạn đang làm những việc như nối thêm một mục trên mỗi đánh dấu và bạn mong đợi 60 mục được thêm vào mỗi giờ. Việc không tính đến sự trôi dạt có thể khiến các chỉ dẫn thứ cấp như di chuyển trung bình để xem xét dữ liệu quá sâu vào quá khứ dẫn đến đầu ra bị lỗi.