changeset: 97310:e54c684e6788 parent: 97307:ed15f399a292 parent: 97309:2752fe734bfb user: Yury Selivanov date: Thu Aug 06 14:04:30 2015 -0400 description: Merge 3.5 (issue #23812) diff -r ed15f399a292 -r e54c684e6788 Lib/asyncio/queues.py --- a/Lib/asyncio/queues.py Thu Aug 06 13:17:27 2015 +0300 +++ b/Lib/asyncio/queues.py Thu Aug 06 14:04:30 2015 -0400 @@ -228,7 +228,7 @@ '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 -r ed15f399a292 -r e54c684e6788 Lib/test/test_asyncio/test_queues.py --- a/Lib/test/test_asyncio/test_queues.py Thu Aug 06 13:17:27 2015 +0300 +++ b/Lib/test/test_asyncio/test_queues.py Thu Aug 06 14:04:30 2015 -0400 @@ -322,7 +322,7 @@ 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 @@ # 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():