питон при засыпании на несколько секунд - PullRequest
0 голосов
/ 09 февраля 2019

Я совершенно новый программист на Python, даже если я программист в C #, и я пытаюсь разработать часы реального времени, которые будут использоваться на дисплее для простого секундомера.

В C # onбазовый ПК, мне нужен только простой цикл, и это прекрасно работает.Но теперь я на 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

Ожидаемый результат - новая строка каждую секунду, но это не так.'t:

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 голосов
/ 09 февраля 2019

Следующие строки ...

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
0 голосов
/ 09 февраля 2019

Вы сбрасываете 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...