ฉันใช้สิ่งนี้เพื่อทำให้เกิดเหตุการณ์ 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 / 20th จากวินาทีจนกระทั่งต้องมีการแก้ไขเกิดขึ้น
ข้อดีของวิธีนี้คือความละเอียดของสัญญาณนาฬิกา ซึ่งอาจทำให้เกิดปัญหาหากคุณทำสิ่งต่าง ๆ เช่นการผนวกหนึ่งรายการต่อหนึ่งขีดและคุณคาดว่าจะเพิ่ม 60 รายการต่อชั่วโมง ความล้มเหลวในการบัญชีเกี่ยวกับการดริฟท์อาจทำให้เกิดข้อบ่งชี้รองเช่นการย้ายค่าเฉลี่ยเพื่อพิจารณาข้อมูลที่ลึกเกินไปในอดีต