time.sleep() 和迭代直到秒数过去之间的区别

differences between time.sleep() and iterating until the seconds pass

我想知道 time.sleep(5) 和下面这段代码之间的 difference/s was/were 是什么:

import time

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

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

谢谢指教。

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

一个time.sleep()是Idle Wait,因为处理器无事可做。如果没有被其他东西使用,你的 CPU 将是 0%。

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

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

  • 保持 CPU 繁忙将保持线程优先级相同甚至更低。

  • 让 CPU 忙碌会让它变得温暖。 CPU 不喜欢高温,它们实际上可能会减慢速度或至少停止 TurboBoost(或类似的 CPU 功能)

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

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