我的目标是能够运行一个函数并每秒打印结果。我希望它看起来像这样:
打印:
“在 {秒},你有 {值}。”//如果该值来自另一个函数,我们也可以假设该值增加某个常数,但由另一个函数计算。
并继续在每一整秒的新行上打印此内容。到目前为止我遇到了两个问题。
1) 我无法编写每秒打印一个值的函数。我尝试过使用线程和时间,但我无法让它工作。
2) 如果我将 sleep 计时器设置为 1 秒,则必须花费几毫秒(或更小的时间测量值)来计算函数,然后才能打印上面的行。我发现经过几百、几千次的计算,我的时间和数值就不再准确了。
到目前为止,我从另一个线程借用了这个:
def update(i):
threading.Timer(1, update, [i]).start()
sys.stdout.write(str(i)+'\r')
sys.stdout.flush()
print(i)
i += 1
这个功能并不像我想象的那样工作。我认为它每次都会将 i 的值增加 1,并将该值放回到 update() 函数中。它只是每次都打印出相同的值。老实说,我不确定为什么,我尝试逐行找出答案,但可惜我做不到。
谢谢
-2.0
最佳答案
将 threading.Timer(1, update, [i]).start()
移至函数末尾,它将正确打印递增值。
如果您希望长期获得 1 Hz 的精确频率,请将上次执行时间 (time.time()
) 存储在附加参数中,并补偿传递给 的间隔>计时器
,例如:
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()
即使您有一些局部漂移(由于线程的调度并不总是瞬时的),它也会在下一步中恢复。
您可以自己尝试一下,在 i += 1
之后添加 time.sleep(random.random()*0.6)
。
关于python - 每秒打印功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31223626/