diff options
author | Guido van Rossum <guido@python.org> | 2015-04-20 16:29:57 (GMT) |
---|---|---|
committer | Guido van Rossum <guido@python.org> | 2015-04-20 16:29:57 (GMT) |
commit | f75d4a7ad00af30dea81e478915696c7106ff3ec (patch) | |
tree | e645ca672c776d45c1d7bbcdfa5687db815b03aa | |
parent | 629d697f969cef4e5b5ec986700ac10908a0d075 (diff) | |
parent | 0bd16bc4cdbb896e6f201f14e43fd44580024362 (diff) | |
download | cpython-f75d4a7ad00af30dea81e478915696c7106ff3ec.zip cpython-f75d4a7ad00af30dea81e478915696c7106ff3ec.tar.gz cpython-f75d4a7ad00af30dea81e478915696c7106ff3ec.tar.bz2 |
Fix asyncio issue 235 (merge from 3.4).
-rw-r--r-- | Lib/asyncio/queues.py | 19 | ||||
-rw-r--r-- | Lib/test/test_asyncio/test_queues.py | 24 | ||||
-rw-r--r-- | Misc/NEWS | 4 |
3 files changed, 36 insertions, 11 deletions
diff --git a/Lib/asyncio/queues.py b/Lib/asyncio/queues.py index 264e1ce..50543c8 100644 --- a/Lib/asyncio/queues.py +++ b/Lib/asyncio/queues.py @@ -53,6 +53,8 @@ class Queue: self._finished.set() self._init(maxsize) + # These three are overridable in subclasses. + def _init(self, maxsize): self._queue = collections.deque() @@ -61,6 +63,11 @@ class Queue: def _put(self, item): self._queue.append(item) + + # End of the overridable methods. + + def __put_internal(self, item): + self._put(item) self._unfinished_tasks += 1 self._finished.clear() @@ -132,7 +139,7 @@ class Queue: 'queue non-empty, why are getters waiting?') getter = self._getters.popleft() - self._put(item) + self.__put_internal(item) # getter cannot be cancelled, we just removed done getters getter.set_result(self._get()) @@ -144,7 +151,7 @@ class Queue: yield from waiter else: - self._put(item) + self.__put_internal(item) def put_nowait(self, item): """Put an item into the queue without blocking. @@ -157,7 +164,7 @@ class Queue: 'queue non-empty, why are getters waiting?') getter = self._getters.popleft() - self._put(item) + self.__put_internal(item) # getter cannot be cancelled, we just removed done getters getter.set_result(self._get()) @@ -165,7 +172,7 @@ class Queue: elif self._maxsize > 0 and self._maxsize <= self.qsize(): raise QueueFull else: - self._put(item) + self.__put_internal(item) @coroutine def get(self): @@ -179,7 +186,7 @@ class Queue: if self._putters: assert self.full(), 'queue not full, why are putters waiting?' item, putter = self._putters.popleft() - self._put(item) + self.__put_internal(item) # When a getter runs and frees up a slot so this putter can # run, we need to defer the put for a tick to ensure that @@ -206,7 +213,7 @@ class Queue: if self._putters: assert self.full(), 'queue not full, why are putters waiting?' item, putter = self._putters.popleft() - self._put(item) + self.__put_internal(item) # Wake putter on next tick. # getter cannot be cancelled, we just removed done putters diff --git a/Lib/test/test_asyncio/test_queues.py b/Lib/test/test_asyncio/test_queues.py index a73539d..88b4f07 100644 --- a/Lib/test/test_asyncio/test_queues.py +++ b/Lib/test/test_asyncio/test_queues.py @@ -408,14 +408,16 @@ class PriorityQueueTests(_QueueTestBase): self.assertEqual([1, 2, 3], items) -class QueueJoinTests(_QueueTestBase): +class _QueueJoinTestMixin: + + q_class = None def test_task_done_underflow(self): - q = asyncio.Queue(loop=self.loop) + q = self.q_class(loop=self.loop) self.assertRaises(ValueError, q.task_done) def test_task_done(self): - q = asyncio.Queue(loop=self.loop) + q = self.q_class(loop=self.loop) for i in range(100): q.put_nowait(i) @@ -452,7 +454,7 @@ class QueueJoinTests(_QueueTestBase): self.loop.run_until_complete(asyncio.wait(tasks, loop=self.loop)) def test_join_empty_queue(self): - q = asyncio.Queue(loop=self.loop) + q = self.q_class(loop=self.loop) # Test that a queue join()s successfully, and before anything else # (done twice for insurance). @@ -465,12 +467,24 @@ class QueueJoinTests(_QueueTestBase): self.loop.run_until_complete(join()) def test_format(self): - q = asyncio.Queue(loop=self.loop) + q = self.q_class(loop=self.loop) self.assertEqual(q._format(), 'maxsize=0') q._unfinished_tasks = 2 self.assertEqual(q._format(), 'maxsize=0 tasks=2') +class QueueJoinTests(_QueueJoinTestMixin, _QueueTestBase): + q_class = asyncio.Queue + + +class LifoQueueJoinTests(_QueueJoinTestMixin, _QueueTestBase): + q_class = asyncio.LifoQueue + + +class PriorityQueueJoinTests(_QueueJoinTestMixin, _QueueTestBase): + q_class = asyncio.PriorityQueue + + if __name__ == '__main__': unittest.main() @@ -49,6 +49,10 @@ Core and Builtins Library ------- +- Fix asyncio issue 235: LifoQueue and PriorityQueue's put didn't + increment unfinished tasks (this bug was introduced when + JoinableQueue was merged with Queue). + - Issue #23908: os functions now reject paths with embedded null character on Windows instead of silently truncate them. |