2012-08-05 73 views
0

我正在编写一个Python脚本,其中有一个正在运行的线程,可以计算一些值并每小时创建一个图形。我想要做的是在该线程中有一个函数,告诉我在下一次更新发生之前还剩多少时间。我目前的执行情况如下:在event.wait之前获取剩余时间在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() 

所以我想在这个类中,让我回剩余时间gefore self.event.wait(self.updateTime)超时被附加其它功能是什么,这样的事情:

def getTimeout(self): 
    return self.event.timeRemaining() 

这是可能以某种方式?

回答

1

好吧,我有一个仲裁协议我的问题。我在StatsUpdater.run中实现了一个变量:

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

就在我做更新功能之前。

现在,当我打电话getTimeout(),我做的:

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

这样,我没有计算密集型的线程运行和计算 一小笔钱每一秒,但我仍然获得了相当不错的指示下一次更新的时间,因为更新之间的时间量也是已知的;)

+0

当然,为什么不.. – 2012-08-05 21:08:55

+0

感谢您的帮助,我在阅读您的回复时得到了主意;) – Maarten 2012-08-05 21:25:29

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 
+0

是的,我想到了我自己也是,谢谢你的反馈。问题是,这个程序运行在Raspberry Pi上(不知道如果你听说过它),所以我有很少的资源,我担心不得不做wait_time = t + 1每秒只会消耗很多时间/资源系统。有没有其他办法可以实现这一点?如果不是这样,请确保它保持现在的状态,能够读取时间,直到下一次更新更为奢侈,然后才是必须的。 – Maarten 2012-08-05 20:16:43

+1

试试吧。也许这是缓慢的,但我怀疑你会注意到。你也可以将睡眠时间改为5秒。 – 2012-08-05 21:06:40