每秒打印功能?

时间:2015-07-04 17:57:37

标签: python multithreading python-3.x time

我的目标是能够运行一个函数并每秒打印一次结果。我希望它看起来像这样:

印刷

“在{秒}你有{值}。” //如果值来自另一个函数,我们也可以假设值上升了一些常数,但是由另一个函数计算。

并且每隔一秒继续在新线上打印。到目前为止,我遇到了两个问题。

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

2 个答案:

答案 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秒以下,此过程会正确补偿它。

相关问题