Python计时器不断增加但不暂停
我现在正在尝试制作一个计时器,用来跟踪一个Python程序的运行时间。我试过很多不同的方法,但在使用while True循环和通过函数调用时,没有一个能正常工作:计时器在需要暂停的时候并没有暂停。
经过几个小时的尝试,我放弃了,后来找到一个GitHub用户,他发布了一个可以暂停的计时器代码。
这是我用来计时的修改过的代码:
from time import time
class Timer:
def __init__(self):
self.time_data = []
self.is_started = False
self.start_time = None
def start(self):
if self.is_started:
return
else:
self.start_time = time()
self.is_started = True
return self
def pause(self) -> None:
elapsed = time() - self.start_time
self.is_started = False
self.time_data.append(elapsed)
def resume(self):
if self.is_started:
print("Timer is already running")
return
self.start_time = (time() - sum(self.time_data)) + 1
self.is_started = True
def elapsed(self):
if self.is_started:
current_elapsed = time() - self.start_time
total_elapsed = sum(self.time_data) + current_elapsed
else:
total_elapsed = sum(self.time_data)
return total_elapsed
然后我尝试在一个简单的程序上测试它:
from timing import Timer
timer = Timer()
timer.start()
sleep(1)
timer.pause()
sleep(2)
print(timer.elapsed()) #should print 1"
timer.resume()
sleep(3)
print(timer.elapsed()) #4"
timer.restart()
timer.pause()
print(timer.elapsed()) #0"
这个程序运行得很好,但当我尝试使用While True和函数时:
from time import sleep
from timing import Timer
timer = Timer()
def start():
timer.start()
def pause():
timer.pause()
start()
while True:
print(timer.elapsed())
if timer.elapsed() >= 3:
pause()
print("paused!")
sleep(0.25)
结果是这样的:
2.2578864097595215
2.5090396404266357
2.7601206302642822
3.011416435241699
paused!
3.011416435241699
paused!
6.274340391159058
paused!
然后它就一直这样,快速地不断增加,最终达到一个很高的值...
有没有人知道这是什么问题呢?
谢谢。
1 个回答
1
看起来那个实现有点问题。这里有一些看起来能正常工作的代码:
import time
class Timer:
def __init__(self):
self.start_time = None
self.pause_time = None
self.elapsed_time = 0
def start(self):
self.start_time = time.time()
self.pause_time = None
def pause(self):
if self.pause_time is not None:
raise ValueError("Timer is already paused")
if self.start_time is None:
raise ValueError("Timer is not running")
self.pause_time = time.time()
self.elapsed_time += self.pause_time - self.start_time
self.start_time = None
def resume(self):
if self.pause_time is None:
raise ValueError("Timer is not paused")
self.start()
def restart(self):
self.start_time = time.time()
self.elapsed_time = 0
def elapsed(self):
if self.start_time is not None:
return time.time() - self.start_time + self.elapsed_time
return self.elapsed_time
timer = Timer()
timer.start()
time.sleep(1)
timer.pause()
time.sleep(2)
print(timer.elapsed()) # should print 1"
timer.resume()
time.sleep(3)
print(timer.elapsed()) # 4"
timer.restart()
timer.pause()
print(timer.elapsed()) # 0"