为什么Python的睡眠功能睡眠不一致

时间:2018-11-11 15:29:07

标签: python sleep

import time
from time import sleep
from datetime import datetime

while True: 
    print datetime.now().strftime('%Y-%m-%d %H:%M:%S')
    sleep(1)

它提供输出

2018-09-23 16:14:42
2018-09-23 16:14:43
2018-09-23 16:14:44
2018-09-23 16:14:45
2018-09-23 16:14:46
2018-09-23 16:14:47
2018-09-23 16:14:48
2018-09-23 16:14:49
2018-09-23 16:14:50
2018-09-23 16:14:51
2018-09-23 16:14:53
2018-09-23 16:14:54
2018-09-23 16:14:55
2018-09-23 16:14:56

跳过第二十二行

1 个答案:

答案 0 :(得分:1)

三个原因:time.sleep()不精确,您的计算机一直在任意数量的进程之间切换,并执行其余代码(查找{{1 }}参考,调用datetime.now方法,查找now()属性,并使用字符串参数调用strftime方法,并打印最后一次调用的结果)需要一点时间时间也执行。

请参见time.sleep() function documentation

  

实际的暂停时间可能少于请求的暂停时间,因为任何捕获到的信号都会在执行该信号的捕获例程后终止strftime()。另外,由于系统中其他活动的安排,暂停时间可能比请求的时间长任意数量。

sleep()调用之间经过的确切时间会有所不同。

因此,您的1秒钟睡眠时间可能比一秒更长,并且打印出每次迭代所需的时间也要少一秒钟。因此有时候,这意味着您从一秒的最后一个微秒跳到了第二秒的前一个微秒,并且时间显示似乎跳了一秒。

当您看到2秒钟的“跳跃”时,将打印以下脚本:

datetime.now()

循环必须做更多的工作,因此它可能会更频繁地打印。

对我来说,在Python 2.7上,经过几分钟的运行时间后,输出:

last = datetime.now()
while True:
    sleep(1)
    t = datetime.now()
    s_delta = t.second - last.second
    if t.second < last.second:  # delta to next minute
        s_delta += 60
    if s_delta > 1:
        print('Time delta > 1s: {:.6f}'.format((t - last).total_seconds()))
    last = t

因此显示可能跳了2秒,但这些步骤之间的实际时间差约为1秒,1毫秒和61微秒。