python - 每秒打印功能?

标签 python multithreading python-3.x time

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

打印:

“在 {秒},你有 {值}。”//如果该值来自另一个函数,我们也可以假设该值增加某个常数,但由另一个函数计算。

并继续在每一整秒的新行上打印此内容。到目前为止我遇到了两个问题。

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/

相关文章:

python - 无服务器并将图像从 Lambda 端点上传到 S3

python - 如何使用此 python 代码将转换后的文件保存到 Amazon S3 和 Media Convert 中的同一源目录

multithreading - 即使UI线程似乎响应,标签文本也不会更新

c# - 向线程发送消息的最佳方式

python - 线程与线程

python - PyCharm 中针对特定类型列表的类型提示自动补全

python - 当我明确提供键作为第一个元素时,为什么排序 python 元组列表更快?

python - Sympy:导数和潜艇

python-3.x - 如何使用 Google Cloud Function 将文件从 Cloud Storage 存储桶推送到实例中?

python - 熄灯