我在类中有以下代码:
def __setattr__(self, key, value):
self.__dict__['d'][key] = value
...
self.saveToIni()
saveToIni
函数将所有dict的项目保存到每个对象的setattr
调用的ini文件中。如果在最后120ms内进行了80次setattr
次调用,则每次都会从头开始写入文件。该函数还命令并有时删除dictonary中的数据,因此我不想更改它。
我想限制一次进入,比如5秒:
setattr
被触发时,计时器以异步方式启动,仍未运行saveToIni
。setattr
进行了任何调用并且计时器仍处于计数状态,则它也不会启动计时器,也不会运行saveToIni
。saveToIni
应该启动。现在,我不确定如何实现这一行为。我曾经想过搞乱线程,但仍然没有找到关于如何做到这一点的想法。
答案 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()