достаточно ли sleep () в python? - PullRequest
0 голосов
/ 30 апреля 2019

Я создал скрипт Python, который записывает время работы ПК в течение дня и сохраняет информацию об использовании в базе данных на следующий день.

while 1:
        time.sleep(59.9)
        # now some code that increments the up-time value by 1 minute
        # my other code here

Это проект функции сумматора временикоторый останавливает выполнение на 59,9 с (я выбрал 59,9 с вместо 1 минуты, так как увеличенное значение необходимо записать в 2 отдельных файла, поэтому я хотел выделить около 100 мс времени для своевременного выполнения этих операций)а затем записывает увеличенное значение в два отдельных файла и продолжает делать это до выключения системы.(каждая итерация этого цикла будет означать, что прошла минута)

Причина, по которой я выбрал sleep() вместо какого-либо другого способа истечения / сохранения времени, заключается в том, что он достаточно хорошо подсчитывает в случаескачков напряжения, так как увеличенное время работы записывается каждую минуту.

Я знаю, что функция time.sleep() не является точной и точной, когда речь идет о времени остановки на небольшую длительность (в миллисекундах или микросекундах).Но поскольку в моем коде время останавливается примерно на минуту, поэтому я считаю, что отклонение / неточность функции сна не будет значительным.

Я тестировал вышеупомянутый скрипт в течение примерно 2 месяцев ирезультаты весьма благоприятны.

Поэтому мне было интересно, является ли это эффективным способом хранения времени работы или существует лучший способ сделать это.

1 Ответ

1 голос
/ 30 апреля 2019

Вы можете попробовать функцию GetTickCount64 .

Пример:

import ctypes
import datetime


def uptime_in_ms():
    lib = ctypes.windll.kernel32
    return lib.GetTickCount64()

def frmt(dt):
    d = dt.days
    _s = dt.seconds
    h, rem = divmod(_s, 3600)
    m, s = divmod(rem, 60)
    return f'{d} day(s), {h:02}h:{m:02}m:{s:02}s'

if __name__ == '__main__':
    ms = uptime_in_ms()
    dt = datetime.timedelta(milliseconds=ms)
    uptime = frmt(dt)
    print(uptime)

Проверка:

C:\Users\User>python Desktop/get_uptime.py
1 day(s), 00h:18m:51s

Примечания:

  1. Минимально поддерживаемый клиент - Windows Vista
  2. Это всего лишь пример, поэтому нет проверки, если эта библиотека существует
  3. В этом примере используется форматирование f-строки - Python 3.6 +
...