Независимый секундомер в Python, на который не влияют изменения системного времени?Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Независимый секундомер в Python, на который не влияют изменения системного времени?

Сообщение Anonymous »

Я работаю над приложением Python, которое включает функцию таймера или секундомера. Приложение предназначено для работы полностью в автономном режиме, и таймер должен быть невосприимчив к изменениям системных часов (например, изменению системного времени пользователем). Я написал код с использованием time.perf_counter(), но столкнулся с проблемой при повторном запуске сценария.
Проблема:
Код работает правильно, и затраченное время не изменяется, когда я уменьшаю системное время (во время первого выполнения). Однако, когда я повторно запускаю сценарий, таймер должен начинаться с нуля, но, похоже, он задерживается на время, в течение которого системные часы были изменены во время первого выполнения.
Например, если я уменьшу системное время на 3 минуты, а затем перезапущу скрипт, то таймер начнет отсчет не сразу, а через 3 минуты (равно изменению времени).

Код: Выделить всё

import time
import threading

class Timer:
def __init__(self):
self.start_time = None
self.elapsed_time = 0.0
self.running = False
self.lock = threading.Lock()

def start(self):
if not self.running:
self.start_time = time.perf_counter()
self.elapsed_time = 0.0
self.running = True
threading.Thread(target=self._run, daemon=True).start()

def _run(self):
last_time = time.perf_counter()
while self.running:
current_time = time.perf_counter()
with self.lock:
self.elapsed_time += current_time - last_time
last_time = current_time
time.sleep(0.1)

def get_elapsed_time(self):
with self.lock:
return self.elapsed_time

def stop(self):
self.running = False

if __name__ == '__main__':
timer = Timer()
timer.start()

try:
while True:
elapsed = timer.get_elapsed_time()
print(f"\rElapsed time: {elapsed:.2f} seconds", end='')
time.sleep(0.1)
except KeyboardInterrupt:
timer.stop()

Проблема:
Расчет прошедшего времени работает правильно во время работы сценария.
При повторном запуске сценария после смены системы времени (например, уменьшаясь на 3 минуты), таймер должен начинаться с нуля, но вместо этого ждет уменьшенного времени перед запуском.
Вопрос:
Как я могу изменить скрипт, чтобы гарантировать, что таймер всегда начинается с нуля и работает точно, независимо от каких-либо изменений системных часов, даже при выполнении нескольких сценариев?
Есть ли лучший подход, чем использование time.perf_counter() для достижения этой цели?

Подробнее здесь: https://stackoverflow.com/questions/786 ... me-changes
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»