在event.wait之前获得剩余时间在Python中完成

时间:2012-08-05 16:10:33

标签: python multithreading timer timeout

我正在编写一个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()

这有可能吗?

2 个答案:

答案 0 :(得分:1)

不支持直接获得剩余时间,但您可以多次睡眠并记录剩余时间。

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

答案 1 :(得分:1)

好吧,我对我的问题有所妥协。我在StatsUpdater.run中实现了一个变量:

self.lastUpdateTime = int(time.time())

在我执行更新功能之前。

现在当我调用getTimeout()时,我会这样做:

def getTimeout(self):
    timePassed = int(time.time() - self.lastUpdateTime
    return self.updateTime - timePassed

这样,我没有计算密集的线程运行和计算 每秒一小笔钱,但我仍然可以很好地了解下次更新的时间,因为更新之间的时间也是已知的;)