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() 之间的区别