1

クラスに次のコードがあります。

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

この関数は、すべてのオブジェクトの呼び出しsaveToIniで、dict のすべての項目を ini ファイルに保存します。setattr最後の 120 ミリ秒で80 回setattrの呼び出しが行われた場合、ファイルは毎回ゼロから書き込まれます。関数は辞書からデータを並べ替えたり、削除したりすることもあるので、変更したくありません。

呼び出しを 1 回、たとえば 5 秒に制限したい:

  1. 最初のsetattrトリガーがトリガーされると、タイマーは非同期に開始されますが、まだ実行されていませんsaveToIni
  2. への呼び出しが行われsetattr、タイマーがまだカウントされている場合、タイマーを起動したり、実行したりしませんsaveToIni
  3. タイマーがタイムアウトすると、saveToIniが起動します。

今、私はこの振る舞いを達成する方法がわかりません。スレッドをいじることを考えましたが、それを行う方法についてのアイデアはまだ見つかりませんでした。

4

2 に答える 2

0

私が行く方法は、timedSaveToIni関数を 5 秒ごとに実行するタイマー スレッドを作成することです。また、実際にディスクにデータを書き込む必要があるかどうかをこの関数に伝えるタグ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 に答える