Python time.sleep vs忙等待准确性

时间:2013-07-06 05:01:48

标签: python performance sleep wait

我正在使用python标准库中的time.sleep函数,发现它不足以满足sub-ms延迟。从测试中我发现实际等待1到1毫秒等待1.1-1.2毫秒。实现忙碌等待使准确度达到1%以内。我用过:

def busy_wait(dt):   
    current_time = time.time()
    while (time.time() < current_time+dt):
        pass

可以在降低1%的准确度之前下降到0.0001秒。

我遇到的主要问题是:

  • 为什么睡眠功能如此不准确(可能是C问题)?获得更好的CPU和更高的时钟速度会改变这个吗?
  • 为什么有人会睡觉?我看到的唯一优势是节能,仅限于嵌入式系统,没有?
  • 通过校准补偿睡眠不准确是否可行?像这样:
def sleep(dt):
    sleep(calibration_function(dt))

顺便说一句,我读到,等待时间过长,睡眠甚至无法正常运行:Upper limit in Python time.sleep()? 我也在某处读到了制作一个较短时间间隔的循环以提高精度,但是当我想延迟0.01秒时,这是无用的。 Karl Voigtland提到使用ctypes的nanosleep,但我觉得这有点过分,而且time.sleep应该做它的预期行为。

time.sleep是一个破碎的python功能?或者没有人关心准确的时间测量?

2 个答案:

答案 0 :(得分:6)

在Windows上,OS Sleep功能(Python必然使用)只能在当前定时器间隔的倍数上唤醒一个线程。通常,其范围在1.0毫秒至15.6毫秒之间。降低定时器间隔可以很方便,因为它允许更短的睡眠,但它浪费电力,正如我在本文中所写:

http://randomascii.wordpress.com/2013/07/08/windows-timer-resolution-megawatts-wasted/

忙碌的等待可能会提供更好的准确性,但通常是一个可怕的想法,因为它浪费更多的电力并从更值得的任务中窃取CPU时间:

https://randomascii.wordpress.com/2012/06/05/in-praise-of-idleness/

最后,忙碌等待的准确性取决于您用于获取当前时间的定时器功能,也可能取决于定时器间隔:

https://randomascii.wordpress.com/2013/05/09/timegettime-versus-gettickcount/

为什么你想睡这么短的时间?通常情况下,最好等待事情发生 - 等待事件 - 而不是等待这么短的时间。

答案 1 :(得分:0)

这是一个重复的问题,但我会尽力在这里尽力回答。

睡眠功能是一种OS调用,它与忙等待不同,因为它不会阻塞线程。如果你有一个多线程脚本,它不应该阻止其他线程。 睡眠功能在Windows中不准确,因为它不是实时操作系统(不确定这意味着什么)。如果您正在严格查看等待的准确性,那么忙碌的等待是可行的方法。否则,time.sleep()可能是首选。操作系统调用睡眠不准确的原因可能是因为它依赖操作系统在正确的时间返回,并且依赖于操作系统调度程序的精度。