time.sleep() 和迭代直到秒过去之间的差异

Posted

技术标签:

【中文标题】time.sleep() 和迭代直到秒过去之间的差异【英文标题】:differences between time.sleep() and iterating until the seconds pass 【发布时间】: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 使用率。 【参考方案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 部分关于进程和线程的内容。

【讨论】:

谢谢,我会研究一下。

以上是关于time.sleep() 和迭代直到秒过去之间的差异的主要内容,如果未能解决你的问题,请参考以下文章

Python & Selenium:driver.implicitly_wait() 和 time.sleep() 之间的区别

python如何微秒级延时?

Time 模块

python进阶练习之——暂停一秒输出

初学python算法100例-案例9 间隔1秒输出结果

x 秒后在两个功能之间切换