我用这导致每小时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个项目。不考虑漂移会导致二次显示,如移动平均值将数据视为太深,导致输出错误。
迂腐点,但可能是重要的,你的代码上面的代码不执行每60秒却让处决之间有60秒的差距。如果你的执行代码完全没有时间,它只会每60秒发生一次。 – Simon 2009-01-23 21:12:24
Dupe:http://stackoverflow.com/questions/373335/suggestions-for-a-cron-like-scheduler-in-python – 2009-01-23 22:14:24
也``time.sleep(60)``可能会返回更早和更晚 – jfs 2014-03-19 07:25:21