Python を使用してソフトウェアを作成しています。Python クラスのように、一連の要素を格納するためのクラスが必要です (順序は関係なく、繰り返される要素ではありません) set
。ただし、要素は一定期間後に自動削除される必要があります.
set.add
そのために、このタイムアウトでデフォルト値の引数を追加して、メソッドを上書きしたいと思います。
私の問題は、それを実装する最良の方法です:スレッド? gobject のようなタイムアウト?
すべての提案を歓迎します!
Python を使用してソフトウェアを作成しています。Python クラスのように、一連の要素を格納するためのクラスが必要です (順序は関係なく、繰り返される要素ではありません) set
。ただし、要素は一定期間後に自動削除される必要があります.
set.add
そのために、このタイムアウトでデフォルト値の引数を追加して、メソッドを上書きしたいと思います。
私の問題は、それを実装する最良の方法です:スレッド? gobject のようなタイムアウト?
すべての提案を歓迎します!
単なるアイデア (もちろん、これが最善の方法ではありません): 辞書を使用して、各追加のタイムスタンプと各項目の具体的なタイムアウトを格納します。次に、アイテムがセットに含まれているかどうかを確認したい場合は、現在の時刻と辞書の値を比較する必要があります。この方法では、タイムアウトが終了したときに各アイテムを削除するために新しいスレッドを開始する必要はありません (キーをディクショナリに保持し、アイテムが再度追加された場合に更新するだけです)。
このソリューションでは、__contains__
と を__iter__
別として実装して、 とが一貫した結果を返すadd
ようにする必要があります。'a' in myset
iter(myset)
import time
class TimedSet(set):
def __init__(self):
self.__table = {}
def add(self, item, timeout=1):
self.__table[item] = time.time() + timeout
set.add(self, item)
def __contains__(self, item):
return time.time() < self.__table.get(item)
def __iter__(self):
for item in set.__iter__(self):
if time.time() < self.__table.get(item):
yield item
考えられる使用例:
t_set = TimedSet()
t_set.add('a')
time.sleep(0.6)
print 'a' in t_set
time.sleep(0.6)
print 'a' in t_set
t_set.add('x', 0.3)
t_set.add('y', 0.4)
t_set.add('z', 0.5)
time.sleep(0.35)
for item in t_set:
print item