【问题标题】:Running a python for loop iteration for 5 seconds运行 python for 循环迭代 5 秒
【发布时间】:2022-10-14 06:33:11
【问题描述】:

以下代码运行 main() 函数并恰好休眠 5 秒 - 运行该函数所花费的时间。

starttime = time.time()
timeout = time.time() + 60 * 2  # 60 seconds times 2 meaning the script will run for 2 
                                # minutes
while time.time() <= timeout:
        main()
        time.sleep(5 - ((time.time() - starttime) % 5.0))  # 5 second interval between 
                                                           # each new iteration

我不确定代码如何

time.sleep(5 - ((time.time() - starttime) % 5.0))

确保 5 秒的间隔。

【问题讨论】:

  • 如果您正在寻找 5 秒的睡眠时间,为什么不直接使用 time.sleep(5)..?
  • 不,实际上我希望确保循环运行 5 秒,其中包括 main 执行所花费的时间
  • 得到你。听起来您想使用信号来处理这种情况并实施适当的超时。不幸的是,我对此并不了解,所以不能告诉您更多

标签: python time delay


【解决方案1】:

已识别的代码确保每 5 秒调用一次 main()除非main() 的执行时间不到 5 秒。这是因为python中的模运算符%while循环的每次迭代中计算(time.time() - starttime)的余数除以5.0。这个余数是main() 在每次迭代中的执行时间。从5 秒中减去它会得到一个睡眠时间,从而导致调用main() 的时间间隔为5 秒。

这里的假设是与执行此处显示的任何其他代码行相比,执行 main() 的时间很重要。在此假设下,要看到(time.time() - starttime) 除以5.0 的余数是main() 的执行时间,请考虑:

  1. 在第一次迭代中,(time.time() - starttime) 是执行main() 的时间,如果main() 的执行时间少于5 秒,则这是除以5.0 的余数。
  2. 在第二次迭代中,(time.time() - starttime) 是 5 秒加上在第二次迭代中执行 main() 的时间,因为第一次迭代中的休眠使得 5.0 在调用 main() 之间经过了秒第一次和第二次迭代。因此,除以5.0 的余数就是在第二次迭代中执行main() 的时间。
  3. 在随后的迭代i 中,很明显(time.time() - starttime)(i - 1) * 5 秒加上在i-th 迭代中执行main() 的时间。因此,(2) 中的论点适用于所有迭代,直到 while 循环退出。

【讨论】: