3

Python を使用してソフトウェアを作成しています。Python クラスのように、一連の要素を格納するためのクラスが必要です (順序は関係なく、繰り返される要素ではありません) set。ただし、要素は一定期間後に自動削除される必要があります.

set.addそのために、このタイムアウトでデフォルト値の引数を追加して、メソッドを上書きしたいと思います。

私の問題は、それを実装する最良の方法です:スレッド? gobject のようなタイムアウト?

すべての提案を歓迎します!

4

2 に答える 2

8

単なるアイデア (もちろん、これが最善の方法ではありません): 辞書を使用して、各追加のタイムスタンプと各項目の具体的なタイムアウトを格納します。次に、アイテムがセットに含まれているかどうかを確認したい場合は、現在の時刻と辞書の値を比較する必要があります。この方法では、タイムアウトが終了したときに各アイテムを削除するために新しいスレッドを開始する必要はありません (キーをディクショナリに保持し、アイテムが再度追加された場合に更新するだけです)。

このソリューションでは、__contains__と を__iter__別として実装して、 とが一貫した結果を返すaddようにする必要があります。'a' in mysetiter(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
于 2013-04-21T23:14:04.523 に答える