Вы не можете надежно построить цикл, который будет печатать только каждую секунду в точке, где число микросекунд в текущем времени равно 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)