Как назначить условный цикл из микросекунды? - PullRequest
0 голосов
/ 07 января 2019

У меня есть очень простой код, который должен выводить '2' каждый раз, когда микросекунда текущего времени равна 2, или один раз в секунду. Однако, когда я запускаю этот код, он ничего не возвращает. Как я могу это исправить?

import datetime
while True:
    if datetime.datetime.now().microsecond == 2:
        print (datetime.datetime.now().microsecond)

1 Ответ

0 голосов
/ 07 января 2019

Вы не можете надежно построить цикл, который будет печатать только каждую секунду в точке, где число микросекунд в текущем времени равно 2.

Компьютерные часы не обязательно отмечают каждую микросекунду , и при этом Python не всегда достаточно быстр, чтобы создать экземпляр datetime для данной микросекунды. Во многих системах вызов datetime.now() будет производить одно и то же значение в течение нескольких микросекунд без перерыва, вплоть до выдачи нового, отличного времени раз в секунду. Ваш код также создает несколько объектов datetime, поэтому после проверки атрибута microsecond следующий объект, созданный при вызове print(), может легко получить более высокое значение microsecond.

См. time модуль , который документирует доступные часы чуть более подробно. datetime использует те же часы, что и time.time:

Точность различных функций реального времени может быть меньше, чем предлагается единицами, в которых выражается их значение или аргумент. Например. в большинстве систем Unix часы «тикают» только 50 или 100 раз в секунду.

и

Обратите внимание, что, хотя время всегда возвращается как число с плавающей запятой, не все системы предоставляют время с большей точностью, чем 1 секунда. Хотя эта функция обычно возвращает неубывающие значения, она может возвращать более низкое значение, чем предыдущий вызов, если между двумя вызовами были установлены системные часы.

Зависит от точность ваших системных часов как от вашей ОС, так и от вашего компьютера; значение имеет не разрешение часов (сколько информации можно указать в значении часов), а то, как часто это значение обновляется.

Если вы хотите ограничить печать раз в секунду, просто отследите последний раз, когда вы печатали, и убедитесь, что новое время по крайней мере на 1 секунду новее:

import datetime

last = datetime.datetime.now()
while True:
    now = datetime.datetime.now()
    if (now - last).total_seconds() >= 1:
        print(now)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...