python入睡几秒钟

时间:2019-02-09 19:01:48

标签: python raspberry-pi3

即使我是C#的老程序员,我还是一个相当新的Python程序员,并且我正在尝试开发一个用于简单秒表的实时时钟。

在基本PC上的C#中,我只需要一个简单的循环,就可以了。但是现在我正在使用Raspberry Pi 3 B +,但遇到了一些问题。

这是我的代码:

if __name__ == '__main__':

    try:
        while True:
            now = datetime.datetime.now()
            if now.second != datetime.datetime.now().second:
                print(now)
                time.sleep(0.1)
    except KeyboardInterrupt:
        pass

预期的输出是每秒换一行,但不是:

2019-02-09 19:33:56.999996
2019-02-09 19:33:57.999999
2019-02-09 19:33:58.999998
2019-02-09 19:34:00.999989
2019-02-09 19:34:01.999999
2019-02-09 19:34:02.999999
2019-02-09 19:34:03.999994
2019-02-09 19:34:07.999989
2019-02-09 19:34:08.999998
2019-02-09 19:34:11.999993
2019-02-09 19:34:12.999993
2019-02-09 19:34:13.999993

正如您在19.34.58看到的那样,它似乎要睡一秒钟,然后在19.34.08睡3秒钟。

有什么办法可以避免这种情况?

如果我尝试截取GPIO中断,问题就更明显了:事件的时间戳有时会延迟2或3秒。

有什么建议吗? 谢谢

2 个答案:

答案 0 :(得分:1)

以下几行...

now = datetime.datetime.now()
if now.second != datetime.datetime.now().second:
    print(now)

...仅当连续两次调用now不在同一秒内时,才会打印datetime.datetime.now()

如您的输出所示,如果第二个增量在两个调用之间均未到达,则有时会失败。

同步计数器

可以像这样构建与datetime保持同步的计数器。

import datetime
import time

precision = 0.1

previous = datetime.datetime.now()
while True:
    now = datetime.datetime.now()
    if previous.second != now.second:
        print(now)
        previous = now
    time.sleep(precision)

输出

2019-02-09 14:32:13.070108
2019-02-09 14:32:14.001819
2019-02-09 14:32:15.033610
2019-02-09 14:32:16.065388
2019-02-09 14:32:17.089926
2019-02-09 14:32:18.021687
2019-02-09 14:32:19.053557

答案 1 :(得分:0)

您重置now的次数太多:

while True:
    now = datetime.datetime.now()
    while True: # keep the 'now' until one second ticked by:
        if now.second != datetime.datetime.now().second:
            print(now)
            time.sleep(0.1)
        else:
            break # get the next now ...

您获得所有输出都是运气..第二个必须在两者之间的时间间隔内计时

now = datetime.datetime.now()                       # this line
if now.second != datetime.datetime.now().second:    # and this line