我正在研究一个准确计时器非常重要的项目。我正在使用python
并使用timer.sleep()
函数。
我注意到由于调度问题,timer.sleep()
函数会增加额外的延迟(请参阅timer.sleep
docs)。由于这个问题,程序运行的时间越长,计时器就越不准确。
是否有更精确的计时器/自动收报机可以解决此问题的程序或解决方案?
任何帮助将不胜感激。欢呼声。
答案 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次的输出是:
这是在Windows上。我现在正在运行100个循环。结果如下。
睡眠仍然准确,但呼叫总是延迟一点。如果您需要一个精确调用每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")