Issue 10110: Let Queue.put recognize a full queue when the maxsize parameter has been reduced.
This commit is contained in:
parent
d285bdb443
commit
189316a2e3
10
Lib/queue.py
10
Lib/queue.py
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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.
|
||||||
|
|
Loading…
Reference in New Issue