Python - 准确的time.sleep

时间:2018-05-24 15:00:25

标签: python timer sleep

我正在研究一个准确计时器非常重要的项目。我正在使用python并使用timer.sleep()函数。

我注意到由于调度问题,timer.sleep()函数会增加额外的延迟(请参阅timer.sleep docs)。由于这个问题,程序运行的时间越长,计时器就越不准确。

是否有更精确的计时器/自动收报机可以解决此问题的程序或解决方案?

任何帮助将不胜感激。欢呼声。

3 个答案:

答案 0 :(得分:2)

我有一个类似于上面的解决方案,但它很快变得处理器很重。这是一个处理器重的想法和解决方法。

def processor_heavy_sleep(ms):  # fine for ms, starts to work the computer hard in second range.
    start = time.clock()
    end = start + ms /1000.
    while time.clock() < end:
        continue
    return start, time.clock()


def efficient_sleep(secs, expected_inaccuracy=0.5):  # for longer times
    start = time.clock()
    end = secs + start
    time.sleep(secs - expected_inaccuracy)
    while time.clock() < end:
        continue
    return start, time.clock()

efficient_sleep(5, 0.5) 3次的输出是:

  • (3.1999303695151594e-07,5.000000003199930365)
  • (5.00005983869791,10.00005983869791)
  • (10.000092477987678,15.000092477987678)

这是在Windows上。我现在正在运行100个循环。结果如下。

  • (485.003749358414,490.003749358414)
  • (490.0037919174879,495.0037922374809)
  • (495.00382903668014,500.00382903668014)

睡眠仍然准确,但呼叫总是延迟一点。如果您需要一个精确调用每xxx秒到毫秒的调度程序,那将是另一回事。

答案 1 :(得分:1)

  

程序运行的时间越长,计时器就越不准确。

     

因此,例如,期望0.5s延迟,它将是time.sleep(0.5 - (start-end))。但仍然没有解决问题

你似乎抱怨两种效果,1)timer.sleep()可能需要比预期更长的事实,2)使用一系列timer.sleep()调用时固有的蠕变。

除了切换到实时操作系统之外,您无法做任何事情。只要请求,底层OS调用被定义为至少休眠。他们只保证你不会早醒;他们不保证你不会迟到。

至于第二个,你应该根据一个不变的时代来计算你的睡眠时间,而不是从你的唤醒时间开始。例如:

import time
import random

start = time.time()
ticker = 0
def myticker():
    # Sleep for 0.5s between tasks, with no creep
    global ticker
    ticker += 1
    now = time.time()
    target = start + ticker * 0.5
    if target > now:
        time.sleep(target - now)


def main():
    previous = time.time()
    for _ in range(100):
        now = time.time()
        print(now - previous)
        previous = now
        # simulate some work
        time.sleep(random.random() / 10)  # Always < tick frequency
        # time.sleep(random.random())     # Not always < tick frequency
        myticker()

if __name__ == "__main__":
    main()

答案 2 :(得分:0)

在没有Windows知识的情况下在Linux上工作,我可能在这里很天真,但是有一些原因可以编写自己的睡眠功能,不能为你工作吗?
类似的东西:

import time

def sleep_time():
    start_time = time.time()
    while (time.time() - start_time) < 0.0001:
        continue

end_time = time.time() + 60 # run for a minute
cnt = 0
while time.time() < end_time:
    cnt += 1
    print('sleeping',cnt)
    sleep_time()
    print('Awake')
print("Slept ",cnt," Times")