Bug 37: Implement queue resizing

This commit is contained in:
Chris AtLee
2010-02-22 14:02:28 -05:00
parent 34171a348b
commit f07b25bedc
2 changed files with 36 additions and 0 deletions

View File

@@ -182,6 +182,15 @@ class LightQueue(object):
"""Return the size of the queue.""" """Return the size of the queue."""
return len(self.queue) return len(self.queue)
def resize(self, size):
"""Resizes the queue's maximum size.
If the size is increased, and there are putters waiting, they may be woken up."""
if size > self.maxsize:
# Maybe wake some stuff up
self._schedule_unlock()
self.maxsize = size
def putting(self): def putting(self):
"""Returns the number of greenthreads that are blocked waiting to put """Returns the number of greenthreads that are blocked waiting to put
items into the queue.""" items into the queue."""

View File

@@ -68,6 +68,33 @@ class TestQueue(LimitedTestCase):
self.assertEquals(evt.wait(),'done') self.assertEquals(evt.wait(),'done')
gt.wait() gt.wait()
def test_resize_up(self):
q = eventlet.Queue(0)
def sender(evt, q):
q.put('hi')
evt.send('done')
evt = event.Event()
gt = eventlet.spawn(sender, evt, q)
eventlet.sleep(0)
self.assert_(not evt.ready())
q.resize(1)
eventlet.sleep(0)
self.assert_(evt.ready())
gt.wait()
def test_resize_down(self):
size = 5
q = eventlet.Queue(5)
for i in range(5):
q.put(i)
self.assertEquals(list(q.queue), range(5))
q.resize(1)
eventlet.sleep(0)
self.assertEquals(list(q.queue), range(5))
def test_multiple_waiters(self): def test_multiple_waiters(self):
# tests that multiple waiters get their results back # tests that multiple waiters get their results back
q = eventlet.Queue() q = eventlet.Queue()