我正在使用python为Minecraft pi版制作一个数字时钟。我正在使用包含大量代码的单个while循环 - 执行一次运行需要很短的时间,但它比我想要的还要多几毫秒,这对我的时钟造成了严重破坏。有没有办法让while循环完全准确?我使用两个time.sleep(1)
计数,但执行时间超过两秒。
示例:
while True:
start = time.time()
for _ in range(5):
1000**3
time.sleep(1)
print (time.time() - start)
每个循环需要超过1秒。
1.00102806091
1.00028204918
1.00103116035
1.00051879883
1.0010240078
1.00102782249
此错误会随着时间的推移而累积。我该如何防止漂移?
答案 0 :(得分:6)
您可以编写时间同步代码(此示例取自我所拥有的服务器监视器):
# sync time so that it runs every two minutes, in 20 minute cycles (:00, :20, :40)
time.sleep(1200 - (time.time() % 1200))
while True:
# Do stuff
time.sleep(120 - (time.time() % 120))
如果你想每两秒运行一次:
time.sleep(2 - (time.time() % 2))
会让它一直睡到下一秒,然后再跑。除非Do stuff
的时间超过一个周期,否则这将有效。然后它将跳过一个节拍。
对于时钟,示例输出:
>>> for _ in range(5):
... time.sleep(1 - (time.time() % 1))
... print time.time()
1478641441.0
1478641442.0
1478641443.0
1478641444.0
1478641445.0
这是有效的,因为time.time() % 1
仅提供当前时间的一小部分:例如0.37
。当我说time.sleep(1 - 0.37)
时,它会睡眠0.63
秒,这是剩下的时间,直到下一轮。
如果下次运行我的代码需要0.55
秒,它将自动休眠剩余的0.45
。