【问题标题】:differences between time.sleep() and iterating until the seconds passtime.sleep() 和迭代直到秒过去之间的差异
【发布时间】:2021-09-29 02:07:01
【问题描述】:

我想知道time.sleep(5) 和以下代码之间的区别是什么:

import time

start_time = time.time()
while True:
    if time.time() - start_time > 5:
        break
print("Five seconds passed")

另外,使用第一种还是第二种解决方案更好? 可能像我一样使用while 循环并不是一个好的解决方案。

感谢您的建议。

【问题讨论】:

  • 当你真的想简单地停止一段预定的时间时,当你想考虑其他程序在同一 cpu 上运行时,time.sleep() 更好。您所拥有的是“忙等待”,这需要 CPU 时间和功率。
  • 这是一个实现细节,但我相信,至少在 Linux 系统上,sleep 最终会调用select 系统调用,其最终结果是基本上让当前线程屈服,所以另一个线程可以执行。相反,反复检查时间的循环将需要相当稳定的 CPU 使用率。

标签: python python-3.x time sleep


【解决方案1】:

while True 循环称为Busy Wait [Wikipedia],因为它将保持处理器运行。这可能会使 1 个核心保持 100%。

time.sleep() 是空闲等待,因为处理器无事可做。如果不被其他东西使用,您的 CPU 将处于 0%。

现在,如果您想完全理解它,事情将变得困难,这可能取决于操作系统。

  • Windows 中的线程调度发生在 1/64 秒(如果未更改)。无论您的程序做什么,它的精度都可能是 1/64 秒,因为这是 Windows 唤醒线程的时间间隔。

  • 保持 CPU 繁忙将使线程优先级保持不变甚至更低。

  • 保持 CPU 忙碌会使它变热。 CPU 不喜欢热量,它们实际上可能会减慢或至少停止 TurboBoost(或类似的 CPU 功能)

  • 保持 CPU 空闲将增加线程优先级。它将使用同步对象并调用WaitForSingleObject() [MSDN],从而将 CPU 交还给操作系统。

很难预测实际会发生什么或哪种方法更精确。要全面了解 Windows 上发生的情况,请阅读 Windows Internals book [Amazon] 第 1 部分关于进程和线程的内容。

【讨论】:

  • 谢谢,我会研究一下。
猜你喜欢
  • 2011-04-29
  • 2019-06-06
  • 2020-01-05
  • 1970-01-01
  • 2011-03-12
  • 2013-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多