Issue 10110: Let Queue.put recognize a full queue when the maxsize parameter has been reduced.

This commit is contained in:
Raymond Hettinger 2010-10-31 17:57:52 +00:00
parent d285bdb443
commit 189316a2e3
3 changed files with 20 additions and 5 deletions

View File

@ -110,14 +110,14 @@ class Queue:
def full(self): def full(self):
"""Return True if the queue is full, False otherwise (not reliable!). """Return True if the queue is full, False otherwise (not reliable!).
This method is likely to be removed at some point. Use qsize() == n This method is likely to be removed at some point. Use qsize() >= n
as a direct substitute, but be aware that either approach risks a race as a direct substitute, but be aware that either approach risks a race
condition where a queue can shrink before the result of full() or condition where a queue can shrink before the result of full() or
qsize() can be used. qsize() can be used.
""" """
self.mutex.acquire() self.mutex.acquire()
n = 0 < self.maxsize == self._qsize() n = 0 < self.maxsize <= self._qsize()
self.mutex.release() self.mutex.release()
return n return n
@ -136,16 +136,16 @@ class Queue:
try: try:
if self.maxsize > 0: if self.maxsize > 0:
if not block: if not block:
if self._qsize() == self.maxsize: if self._qsize() >= self.maxsize:
raise Full raise Full
elif timeout is None: elif timeout is None:
while self._qsize() == self.maxsize: while self._qsize() >= self.maxsize:
self.not_full.wait() self.not_full.wait()
elif timeout < 0: elif timeout < 0:
raise ValueError("'timeout' must be a positive number") raise ValueError("'timeout' must be a positive number")
else: else:
endtime = _time() + timeout endtime = _time() + timeout
while self._qsize() == self.maxsize: while self._qsize() >= self.maxsize:
remaining = endtime - _time() remaining = endtime - _time()
if remaining <= 0.0: if remaining <= 0.0:
raise Full raise Full

View File

@ -216,6 +216,18 @@ class BaseQueueTest(unittest.TestCase, BlockingTestMixin):
with self.assertRaises(queue.Empty): with self.assertRaises(queue.Empty):
q.get_nowait() q.get_nowait()
def test_shrinking_queue(self):
# issue 10110
q = self.type2test(3)
q.put(1)
q.put(2)
q.put(3)
with self.assertRaises(queue.Full):
q.put_nowait(4)
self.assertEqual(q.qsize(), 3)
q.maxsize = 2 # shrink the queue
with self.assertRaises(queue.Full):
q.put_nowait(4)
class QueueTest(BaseQueueTest): class QueueTest(BaseQueueTest):
type2test = queue.Queue type2test = queue.Queue

View File

@ -62,6 +62,9 @@ Library
- Issue #10266: uu.decode didn't close in_file explicitly when it was given - Issue #10266: uu.decode didn't close in_file explicitly when it was given
as a filename. Patch by Brian Brazil. as a filename. Patch by Brian Brazil.
- Issue #10110: Queue objects didn't recognize full queues when the
maxsize parameter had been reduced.
- Issue #10160: Speed up operator.attrgetter. Patch by Christos Georgiou. - Issue #10160: Speed up operator.attrgetter. Patch by Christos Georgiou.
- logging: Added style option to basicConfig() to allow %, {} or $-formatting. - logging: Added style option to basicConfig() to allow %, {} or $-formatting.