我正在编写一个Python脚本,其中运行一个线程,该线程每小时计算一些值并创建一个图。我想做的是在这个线程中有一个函数,它告诉在下一次更新发生之前还有多少时间。我目前的实现如下:
class StatsUpdater(threading.Thread):
def __init__(self, updateTime):
threading.Thread.__init__(self)
self.event = threading.Event()
self.updateTime = updateTime
def run(self):
while not self.event.is_set():
self.updateStats()
self.event.wait(self.updateTime)
def updateStats(self):
print "Updating Stats"
tables = SQLInterface.listTables()
for table in tables:
PlotTools.createAndSave(table)
def stop(self):
self.event.set()
因此,我想在该类中添加另一个函数,它可以让我返回self.event.wait(self.updateTime)超时前的剩余时间,类似于以下内容:
def getTimeout(self):
return self.event.timeRemaining()
这有可能吗?
不支持直接获取剩余时间,但您可以睡几次,并跟踪剩余时间。
def __init__(self, updateTime):
threading.Thread.__init__(self)
self.event = threading.Event()
self.updateTime = updateTime
self.wait_time=None
def run(self):
while not self.event.is_set():
self.updateStats()
try:
self.wait_time=self.updateTime
inttime=int(self.updateTime)
remaining=inttime-self.updateTime
self.event.wait(remaining)
for t in reversed(range(inttime)):
self.wait_time=t+1
self.event.wait(1)
finally:
self.wait_time=0
然后使用
def getTimeout(self):
return self.wait_time
好吧,我对我的问题有一个折衷方案。我在StatsUpdater.run中实现了一个变量:
self.lastUpdateTime = int(time.time())
就在我执行更新功能之前。
现在,当我调用getTimeout()时,我会调用:
def getTimeout(self):
timePassed = int(time.time() - self.lastUpdateTime
return self.updateTime - timePassed
这样,我就没有计算密集型的线程在运行和计算每秒一个很小的总数,但我仍然能很好地指示下一次更新的时间,因为更新之间的时间总量也是已知的;)