1

我在一个类中有以下代码:

def __setattr__(self, key, value):
    self.__dict__['d'][key] = value
    ...
    self.saveToIni()

saveToIni函数在每个对象调用时将所有 dict 的项目保存到一个 ini 文件中setattr。如果在最后 120 毫秒内进行了 80setattr次调用,那么每次都会从头开始写入文件。该函数还命令并有时从字典中删除数据,所以我不想更改它。

我想将调用限制为一次,比如说 5 秒:

  1. 当第一个setattr被触发时,一个定时器异步启动,仍然没有运行saveToIni
  2. 如果进行了任何调用setattr并且计时器仍在计数,则它既不会触发计时器也不会运行saveToIni
  3. 当计时器超时时,saveToIni应该启动。

现在,我不确定如何实现这种行为。我曾想过弄乱线程,但仍然没有找到如何去做的想法。

4

2 回答 2

0

我要走的路是创建一个定时器线程,它每 5 秒运行一次timedSaveToIni函数。我也会有一个标签isSaveRequested告诉这个函数它是否应该实际将数据写入磁盘。

_ setattr _函数只需将此标记设置为 true

您的代码如下所示:

class Dict:

  def __init__(self):
    ...
    self.isSaveRequested = False
    self.timedSaveToIni()

  def timedSaveToIni(self):
    threading.Timer(5.0, self.timedSaveToIni).start()
    if self.isSaveRequested:
      self.saveToIni()
      self.isSaveRequested = False


  def __setattr__(self, key, value):
    self.__dict__['d'][key] = value
    ...
    self.isSaveRequested = True

  def saveToInit()
    ...
于 2012-10-14T23:05:04.057 回答
0

也许您只是让函数记住上次调用它的时间,直到自上次调用以来已经过去了 5 秒,才让它阻塞(睡眠)。这真的不需要任何类型的线程。这是一个示例 - 只是一个想法,并不特定于您的用例。

import time

def timed_func():
  while (timed_func.last_use + 5) > time.time():
    time.sleep(1)
  print "I am working..." # Do the job
  timed_func.last_use = time.time()

def main():
  timed_func.last_use = time.time() - 5
  while True:
    timed_func()

if __name__ == '__main__':
  main()
于 2012-10-14T23:29:22.980 回答