在我的劇本,我讀了套接字消息,並根據在消息中的內容改變一些內存對象的狀態。一切正常。如何及時跟蹤對象狀態?
但我想要實現非活動對象的缺失:例如,如果有在一段時間內對指定對象沒有消息,它應該被刪除。什麼是最好的方式來做到這一點?
在我的劇本,我讀了套接字消息,並根據在消息中的內容改變一些內存對象的狀態。一切正常。如何及時跟蹤對象狀態?
但我想要實現非活動對象的缺失:例如,如果有在一段時間內對指定對象沒有消息,它應該被刪除。什麼是最好的方式來做到這一點?
這一條可能不適合你的工作,但: 如果您能夠接受在指定時間後不刪除對象,但只保留對象的指定數,Python的3.2有functools.lru_cache正是出於這個。
商店中的每個對象的時間戳 - 當你修改更新時間戳當前時間。
然後有運行每隔一段時間,着眼於所有的對象,並早於一定量的時間戳在當前時間之前刪除任何東西。
如果您遇到了Python 2,或者您需要基於時間戳並且Amber的答案不夠快,您可以對Python 3的lru_cache做些什麼變化,但是需要修改對象的修改時間考慮到:
(我沒有測試這一點;希望的錯誤是輕微的,思路是清晰的。)在OrderedDict
存儲中的對象(有一個package的蟒蛇比2.7以上) 。
import collections
objects = collections.OrderedDict()
我假設你有每個對象的一些關鍵,所以你可以在流中標識它們。做一個常規查找的變體,從字典中刪除並重新插入一個已經存在的對象。這將保持OrderedDict按上次訪問進行排序。
try:
obj = objects.pop(the_key)
except KeyError:
obj = create_new_object(the_key)
objects[the_key] = obj
obj.timestamp = current_time()
然後,每過一段時間(或每次),刪除舊的對象。該LRU變種(限制對象的數量)是很容易的:
while len(objects) > some_threshold:
objects.popitem(last=False)
基於時間戳的變種是一個有點棘手,但數量不多。最古老的作品在前面,所以我們只需要看第一個,如果它太古老就彈出它。
while objects:
obj = objects.itervalues().next() # Python 2 only :(
if obj.timestamp < some_threshold():
objects.popitem(last=False)
else:
break
眼球分析說,這給你攤銷O(1)訪問,和O兩種變體(數量拋棄的物體)保養。
+1限制對象的數量實際上可能是一個更好的選擇:它使內存使用率較低,如果大量的對象,在繁忙peroids被訪問,並且不刪除對象時根本沒有一個短期的任何請求。 – delnan
Python 3.2的要求可能是一個更強的原因。 (雖然它很可能從Python 3中的[functools(http://hg.python.org/cpython/file/default/Lib/functools.py#l123)適應。) –