cpython: 2752fe734bfb (original) (raw)
Mercurial > cpython
changeset 97309:2752fe734bfb 3.5
Merge 3.4 (issue #23812) [#23812]
Yury Selivanov yselivanov@sprymix.com | |
---|---|
date | Thu, 06 Aug 2015 14:04:12 -0400 |
parents | 526a186de32d(current diff)024d4f4011c9(diff) |
children | e54c684e6788 b9a0165a3de8 |
files | Lib/asyncio/queues.py |
diffstat | 2 files changed, 37 insertions(+), 2 deletions(-)[+] [-] Lib/asyncio/queues.py 2 Lib/test/test_asyncio/test_queues.py 37 |
line wrap: on
line diff
--- 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)[](#l1.7)
self.__put_internal(item)[](#l1.8)
# getter cannot be cancelled, we just removed done getters getter.set_result(item)
--- 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())
@@ -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():[](#l2.17)
yield 0.01[](#l2.18)
yield 0.1[](#l2.19)
loop = self.new_test_loop(gen)[](#l2.21)
loop.set_debug(True)[](#l2.22)
q = asyncio.Queue(loop=loop)[](#l2.24)
reader1 = loop.create_task(q.get())[](#l2.26)
reader2 = loop.create_task(q.get())[](#l2.27)
reader3 = loop.create_task(q.get())[](#l2.28)
loop.run_until_complete(asyncio.sleep(0.01, loop=loop))[](#l2.30)
q.put_nowait(1)[](#l2.32)
q.put_nowait(2)[](#l2.33)
reader1.cancel()[](#l2.34)
try:[](#l2.36)
loop.run_until_complete(reader1)[](#l2.37)
except asyncio.CancelledError:[](#l2.38)
pass[](#l2.39)
loop.run_until_complete(reader3)[](#l2.41)
# reader2 will receive `2`, because it was added to the[](#l2.43)
# queue of pending readers *before* put_nowaits were called.[](#l2.44)
self.assertEqual(reader2.result(), 2)[](#l2.45)
# reader3 will receive `1`, because reader1 was cancelled[](#l2.46)
# before is had a chance to execute, and `2` was already[](#l2.47)
# pushed to reader2 by second `put_nowait`.[](#l2.48)
self.assertEqual(reader3.result(), 1)[](#l2.49)