我的目标是能够运行一个函数并每秒打印一次结果。我希望它看起来像这样:
印刷:
“在{秒}你有{值}。” //如果值来自另一个函数,我们也可以假设值上升了一些常数,但是由另一个函数计算。
并且每隔一秒继续在新线上打印。到目前为止,我遇到了两个问题。
1)我无法编写每秒打印一次值的函数。我已尝试使用线程和时间,但我无法让它工作。
2)如果我将睡眠定时器设置为1秒,则必须花费几毫秒(或更小的时间测量)然后在打印上述行之前计算该函数。我认为经过几百/千次计算后,我的时间和价值将不再准确。
到目前为止,我从另一个帖子中借用了这个:
def update(i):
threading.Timer(1, update, [i]).start()
sys.stdout.write(str(i)+'\r')
sys.stdout.flush()
print(i)
i += 1
这个功能不符合我的想象。我认为它每次都会增加一个 i 的值,并将该值放回update()函数中。它只是每次打印出相同的值。老实说,我不知道为什么,我试着逐行去弄清楚,但是我不能。但是,我不能。
由于
-2.0
答案 0 :(得分:1)
将threading.Timer(1, update, [i]).start()
移动到函数末尾,它将正确打印递增值。
如果您希望从长远来看具有1 Hz的准确频率,请将最后执行时间(time.time()
)存储在附加参数中,并补偿传递给Timer
的时间间隔,例如:< / p>
def update(i, last_time=time.time()-1):
sys.stdout.write(str(i)+'\r')
sys.stdout.flush()
print(i)
i += 1
cur_time = time.time()
threading.Timer(2-(cur_time-last_time), update, [i, cur_time]).start()
即使您有一些局部漂移(由于线程的安排并非总是瞬间),它将在下一步中恢复。
您可以在time.sleep(random.random()*0.6)
之后添加i += 1
来自行尝试。
答案 1 :(得分:0)
通过精确计算预期时刻避免累积误差,但用实际剩余时间调用sleep
函数直到当前间隔结束。
import datetime
import time
tstep = datetime.timedelta(seconds=1)
tnext = datetime.datetime.now() + tstep
while True:
print "something"
tdiff = tnext - datetime.datetime.now()
time.sleep(tdiff.total_seconds())
tnext = tnext + tstep
如果您的处理时间保持在1秒以下,此过程会正确补偿它。