如何限制函数的调用,但之后肯定会处理它

时间:2012-10-14 22:46:12

标签: python limit

我在类中有以下代码:

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

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

我想限制一次进入,比如5秒:

  1. 当第一个setattr被触发时,计时器以异步方式启动,仍未运行saveToIni
  2. 如果对setattr进行了任何调用并且计时器仍处于计数状态,则它也不会启动计时器,也不会运行saveToIni
  3. 当计时器超时时,saveToIni应该启动。
  4. 现在,我不确定如何实现这一行为。我曾经想过搞乱线程,但仍然没有找到关于如何做到这一点的想法。

2 个答案:

答案 0 :(得分: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()
    ...

答案 1 :(得分: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()