【发布时间】:2013-07-04 04:52:57
【问题描述】:
我正在使用 python 标准库中的 time.sleep 函数,发现它不足以应对亚毫秒级的延迟。通过测试,我发现它实际上等待 1.1-1.2 毫秒等待 1 毫秒。实施繁忙的等待使准确度在 1% 以内。我用过:
def busy_wait(dt):
current_time = time.time()
while (time.time() < current_time+dt):
pass
并且可以在 0.0001 秒内达到 1% 的准确率。
我的主要问题是:
- 为什么睡眠功能如此不准确(可能是 C 问题)?获得具有更高时钟速度的更好 CPU 会改变这种情况吗?
- 为什么有人会使用睡眠?我看到的唯一优势(节能)仅限于嵌入式系统,不是吗?
- 是否可以通过校准来补偿睡眠的不准确性?像这样:
顺便说一句,我读到睡眠在等待时间长的情况下甚至无法正常工作:Upper limit in Python time.sleep()? 我还在 SO 上的某处读到了制作更短时间间隔的循环以提高精度,但是当我想延迟 0.01 秒时这是没用的。 Karl Voigtland 提到使用 ctypes 的 nanosleep,但我觉得这太过分了,time.sleep 应该做它的预期行为。
time.sleep 是一个损坏的 python 功能?还是没有人足够关心精确的时间测量?
【问题讨论】:
-
是的,我认为这是一个操作系统调用,但现在我想知道为什么他们在忙碌等待时使用操作系统调用更好。
-
繁忙的等待会占用 CPU 时间并阻塞 CPU。睡眠会进行上下文切换并且不会阻止其他执行(它会“阻止”您的执行)。一般来说,如果你真的需要确切的时间,你只会忙着等待,即使那样,你仍然受限于操作系统对 CPU 的需求,这可能会让你离开……
-
@JDong:在一般情况下忙等待并不是更好,因为操作系统可以在任何时候抢占您的程序。因此,根据 CPU 负载和调度程序的反复无常,阳光下的任何睡眠策略都可能是任意糟糕的。
标签: python performance sleep wait