|
@@ -975,7 +975,7 @@ class Messagebuffer(Evictable):
|
|
self._len = self.data.__len__
|
|
self._len = self.data.__len__
|
|
self._extend = self.data.extend
|
|
self._extend = self.data.extend
|
|
|
|
|
|
- def append(self, item):
|
|
|
|
|
|
+ def put(self, item):
|
|
self._append(item)
|
|
self._append(item)
|
|
self.maxsize and self._evict()
|
|
self.maxsize and self._evict()
|
|
|
|
|
|
@@ -983,7 +983,7 @@ class Messagebuffer(Evictable):
|
|
self._extend(it)
|
|
self._extend(it)
|
|
self.maxsize and self._evict()
|
|
self.maxsize and self._evict()
|
|
|
|
|
|
- def pop(self, *default):
|
|
|
|
|
|
+ def take(self, *default):
|
|
try:
|
|
try:
|
|
return self._pop()
|
|
return self._pop()
|
|
except IndexError:
|
|
except IndexError:
|
|
@@ -992,7 +992,7 @@ class Messagebuffer(Evictable):
|
|
raise self.Empty()
|
|
raise self.Empty()
|
|
|
|
|
|
def _pop_to_evict(self):
|
|
def _pop_to_evict(self):
|
|
- return self.pop()
|
|
|
|
|
|
+ return self.take()
|
|
|
|
|
|
def __repr__(self):
|
|
def __repr__(self):
|
|
return '<{0}: {1}/{2}>'.format(
|
|
return '<{0}: {1}/{2}>'.format(
|
|
@@ -1042,7 +1042,18 @@ class BufferMap(OrderedDict, Evictable):
|
|
self.update(iterable)
|
|
self.update(iterable)
|
|
self.total = sum(len(buf) for buf in items(self))
|
|
self.total = sum(len(buf) for buf in items(self))
|
|
|
|
|
|
- def pop(self, key, *default):
|
|
|
|
|
|
+ def put(self, key, item):
|
|
|
|
+ self._get_or_create_buffer(key).put(item)
|
|
|
|
+ self.total += 1
|
|
|
|
+ self.move_to_end(key) # least recently used.
|
|
|
|
+ self.maxsize and self._evict()
|
|
|
|
+
|
|
|
|
+ def extend(self, key, it):
|
|
|
|
+ self._get_or_create_buffer(key).extend(it)
|
|
|
|
+ self.total += len(it)
|
|
|
|
+ self.maxsize and self._evict()
|
|
|
|
+
|
|
|
|
+ def take(self, key, *default):
|
|
item, throw = None, False
|
|
item, throw = None, False
|
|
try:
|
|
try:
|
|
buf = self[key]
|
|
buf = self[key]
|
|
@@ -1050,12 +1061,12 @@ class BufferMap(OrderedDict, Evictable):
|
|
throw = True
|
|
throw = True
|
|
else:
|
|
else:
|
|
try:
|
|
try:
|
|
- item = buf.pop()
|
|
|
|
|
|
+ item = buf.take()
|
|
self.total -= 1
|
|
self.total -= 1
|
|
except self.Empty:
|
|
except self.Empty:
|
|
throw = True
|
|
throw = True
|
|
else:
|
|
else:
|
|
- self.move_to_end(key) # least recently used.
|
|
|
|
|
|
+ self.move_to_end(key) # mark as LRU
|
|
|
|
|
|
if throw:
|
|
if throw:
|
|
if default:
|
|
if default:
|
|
@@ -1063,50 +1074,39 @@ class BufferMap(OrderedDict, Evictable):
|
|
raise self.Empty()
|
|
raise self.Empty()
|
|
return item
|
|
return item
|
|
|
|
|
|
- def get_or_create(self, key):
|
|
|
|
|
|
+ def _get_or_create_buffer(self, key):
|
|
try:
|
|
try:
|
|
return self[key]
|
|
return self[key]
|
|
except KeyError:
|
|
except KeyError:
|
|
- buf = self[key] = self.Buffer(maxsize=self.bufmaxsize)
|
|
|
|
|
|
+ buf = self[key] = self._new_buffer()
|
|
return buf
|
|
return buf
|
|
|
|
|
|
- def discard(self, key, *default):
|
|
|
|
- super(BufferMap, self).pop(key, *default)
|
|
|
|
|
|
+ def _new_buffer(self):
|
|
|
|
+ return self.Buffer(maxsize=self.bufmaxsize)
|
|
|
|
|
|
def _LRUpop(self, *default):
|
|
def _LRUpop(self, *default):
|
|
- return self[self._LRUkey()].pop(*default)
|
|
|
|
|
|
+ return self[self._LRUkey()].take(*default)
|
|
|
|
|
|
def _pop_to_evict(self):
|
|
def _pop_to_evict(self):
|
|
for i in range(100):
|
|
for i in range(100):
|
|
key = self._LRUkey()
|
|
key = self._LRUkey()
|
|
buf = self[key]
|
|
buf = self[key]
|
|
try:
|
|
try:
|
|
- buf.pop()
|
|
|
|
|
|
+ buf.take()
|
|
except (IndexError, self.Empty):
|
|
except (IndexError, self.Empty):
|
|
# buffer empty, remove it from mapping.
|
|
# buffer empty, remove it from mapping.
|
|
- self.discard(key)
|
|
|
|
|
|
+ self.pop(key)
|
|
else:
|
|
else:
|
|
# we removed one item
|
|
# we removed one item
|
|
self.total -= 1
|
|
self.total -= 1
|
|
# if buffer is empty now, remove it from mapping.
|
|
# if buffer is empty now, remove it from mapping.
|
|
if not len(buf):
|
|
if not len(buf):
|
|
- self.discard(key)
|
|
|
|
|
|
+ self.pop(key)
|
|
else:
|
|
else:
|
|
# move to least recently used.
|
|
# move to least recently used.
|
|
self.move_to_end(key)
|
|
self.move_to_end(key)
|
|
break
|
|
break
|
|
|
|
|
|
- def append(self, key, item):
|
|
|
|
- self.get_or_create(key).append(item)
|
|
|
|
- self.total += 1
|
|
|
|
- self.move_to_end(key) # least recently used.
|
|
|
|
- self.maxsize and self._evict()
|
|
|
|
-
|
|
|
|
- def extend(self, key, it):
|
|
|
|
- self.get_or_create(key).extend(it)
|
|
|
|
- self.total += len(it)
|
|
|
|
- self.maxsize and self._evict()
|
|
|
|
-
|
|
|
|
def __repr__(self):
|
|
def __repr__(self):
|
|
return '<{0}: {1}/{2}>'.format(
|
|
return '<{0}: {1}/{2}>'.format(
|
|
type(self).__name__, self.total, self.maxsize,
|
|
type(self).__name__, self.total, self.maxsize,
|