summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYury Selivanov <yselivanov@sprymix.com>2015-08-06 18:04:12 (GMT)
committerYury Selivanov <yselivanov@sprymix.com>2015-08-06 18:04:12 (GMT)
commite03f42717cc7e2bab2fc03b72d17a558757060e4 (patch)
tree48b024e0771a3c948cbbacaa824e34d5c5d61d3f
parentabfaecdfdd9c10732e221eada3c259523fd14a8f (diff)
parent159fbdd805e23e54ba7830ec2c492a511a6d8e89 (diff)
downloadcpython-e03f42717cc7e2bab2fc03b72d17a558757060e4.zip
cpython-e03f42717cc7e2bab2fc03b72d17a558757060e4.tar.gz
cpython-e03f42717cc7e2bab2fc03b72d17a558757060e4.tar.bz2
Merge 3.4 (issue #23812)
-rw-r--r--Lib/asyncio/queues.py2
-rw-r--r--Lib/test/test_asyncio/test_queues.py37
2 files changed, 37 insertions, 2 deletions
diff --git a/Lib/asyncio/queues.py b/Lib/asyncio/queues.py
index b26edfb..021043d 100644
--- a/Lib/asyncio/queues.py
+++ b/Lib/asyncio/queues.py
@@ -228,7 +228,7 @@ class Queue:
'queue non-empty, why are getters waiting?')
getter = self._getters.popleft()
- self._put_internal(item)
+ self.__put_internal(item)
# getter cannot be cancelled, we just removed done getters
getter.set_result(item)
diff --git a/Lib/test/test_asyncio/test_queues.py b/Lib/test/test_asyncio/test_queues.py
index 7c7d0ea..8e38175 100644
--- a/Lib/test/test_asyncio/test_queues.py
+++ b/Lib/test/test_asyncio/test_queues.py
@@ -322,7 +322,7 @@ class QueuePutTests(_QueueTestBase):
q.put_nowait(1)
self.assertEqual(1, q.get_nowait())
- def test_get_cancel_drop(self):
+ def test_get_cancel_drop_one_pending_reader(self):
def gen():
yield 0.01
yield 0.1
@@ -350,6 +350,41 @@ class QueuePutTests(_QueueTestBase):
# if we get 2, it means 1 got dropped!
self.assertEqual(1, result)
+ def test_get_cancel_drop_many_pending_readers(self):
+ def gen():
+ yield 0.01
+ yield 0.1
+
+ loop = self.new_test_loop(gen)
+ loop.set_debug(True)
+
+ q = asyncio.Queue(loop=loop)
+
+ reader1 = loop.create_task(q.get())
+ reader2 = loop.create_task(q.get())
+ reader3 = loop.create_task(q.get())
+
+ loop.run_until_complete(asyncio.sleep(0.01, loop=loop))
+
+ q.put_nowait(1)
+ q.put_nowait(2)
+ reader1.cancel()
+
+ try:
+ loop.run_until_complete(reader1)
+ except asyncio.CancelledError:
+ pass
+
+ loop.run_until_complete(reader3)
+
+ # reader2 will receive `2`, because it was added to the
+ # queue of pending readers *before* put_nowaits were called.
+ self.assertEqual(reader2.result(), 2)
+ # reader3 will receive `1`, because reader1 was cancelled
+ # before is had a chance to execute, and `2` was already
+ # pushed to reader2 by second `put_nowait`.
+ self.assertEqual(reader3.result(), 1)
+
def test_put_cancel_drop(self):
def gen():