[Python-checkins] cpython (merge 3.4 -> default): Fix asyncio issue 235 (merge from 3.4).
guido.van.rossum
python-checkins at python.org
Mon Apr 20 18:30:15 CEST 2015
https://hg.python.org/cpython/rev/c3cd486cb6b9
changeset: 95743:c3cd486cb6b9
parent: 95741:7a7f09528866
parent: 95742:8e0dc4d3b49c
user: Guido van Rossum <guido at python.org>
date: Mon Apr 20 09:29:57 2015 -0700
summary:
Fix asyncio issue 235 (merge from 3.4).
files:
Lib/asyncio/queues.py | 19 ++++++++----
Lib/test/test_asyncio/test_queues.py | 24 ++++++++++++---
Misc/NEWS | 4 ++
3 files changed, 36 insertions(+), 11 deletions(-)
diff --git a/Lib/asyncio/queues.py b/Lib/asyncio/queues.py
--- a/Lib/asyncio/queues.py
+++ b/Lib/asyncio/queues.py
@@ -53,6 +53,8 @@
self._finished.set()
self._init(maxsize)
+ # These three are overridable in subclasses.
+
def _init(self, maxsize):
self._queue = collections.deque()
@@ -61,6 +63,11 @@
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 @@
'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 @@
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 @@
'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 @@
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 @@
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 @@
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
--- a/Lib/test/test_asyncio/test_queues.py
+++ b/Lib/test/test_asyncio/test_queues.py
@@ -408,14 +408,16 @@
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 @@
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 @@
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()
diff --git a/Misc/NEWS b/Misc/NEWS
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -49,6 +49,10 @@
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.
--
Repository URL: https://hg.python.org/cpython
More information about the Python-checkins
mailing list