Проблема:
Код работает правильно, и затраченное время не изменяется, когда я уменьшаю системное время (во время первого выполнения). Однако, когда я повторно запускаю сценарий, таймер должен начинаться с нуля, но, похоже, он задерживается на время, в течение которого системные часы были изменены во время первого выполнения.
Например, если я уменьшу системное время на 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