如何使while循环花费一定的时间

时间:2016-11-08 21:31:54

标签: python while-loop

我正在使用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

此错误会随着时间的推移而累积。我该如何防止漂移?

1 个答案:

答案 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