Bug 37: Implement queue resizing
This commit is contained in:
@@ -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."""
|
||||||
|
@@ -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()
|
||||||
|
Reference in New Issue
Block a user