class PhotoCache: def __init__(self, maxLen): self.l = ReadWriteLock() self.nextT = int((time() - 1312742671) * 4) self.maxLen = maxLen self.m = {} self.s = [] def update(self, photoId, data): self.l.acquireWrite() if photoId in self.m: oldT, oldData = self.m[photoId] data['tagging_id'] = oldData['tagging_id'] newInfo = (oldT, data) else: data['tagging_id'] = self.nextT newInfo = (self.nextT, data) self.nextT = self.nextT + 1 self.s.append(photoId) if len(self.s) > self.maxLen: self.s.pop(0) self.m[photoId] = newInfo self.l.release() return newInfo def dumpLatest(self, n): self.l.acquireRead() print >> sys.stderr, map(lambda photoId: self.m[photoId][1]['tagging_id'], self.s[-n:]) self.l.release() def getLatest(self, n): self.l.acquireRead() output = [] for photoId in self.s[-n:]: output.append(self.m[photoId][1]) self.l.release() return output