changeset: 104621:b0af901b1e2a branch: 3.6 parent: 104618:3908f432d0ac parent: 104620:b1aa485fad1b user: Yury Selivanov date: Fri Oct 21 17:23:35 2016 -0400 files: Misc/NEWS description: Merge 3.5 (issue #26923) diff -r 3908f432d0ac -r b0af901b1e2a Lib/asyncio/tasks.py --- a/Lib/asyncio/tasks.py Fri Oct 21 17:13:40 2016 -0400 +++ b/Lib/asyncio/tasks.py Fri Oct 21 17:23:35 2016 -0400 @@ -592,9 +592,11 @@ def cancel(self): if self.done(): return False + ret = False for child in self._children: - child.cancel() - return True + if child.cancel(): + ret = True + return ret def gather(*coros_or_futures, loop=None, return_exceptions=False): diff -r 3908f432d0ac -r b0af901b1e2a Lib/test/test_asyncio/test_tasks.py --- a/Lib/test/test_asyncio/test_tasks.py Fri Oct 21 17:13:40 2016 -0400 +++ b/Lib/test/test_asyncio/test_tasks.py Fri Oct 21 17:23:35 2016 -0400 @@ -1899,6 +1899,36 @@ def test_cancel_wait_for(self): self._test_cancel_wait_for(60.0) + def test_cancel_gather(self): + """Ensure that a gathering future refuses to be cancelled once all + children are done""" + loop = asyncio.new_event_loop() + self.addCleanup(loop.close) + + fut = asyncio.Future(loop=loop) + # The indirection fut->child_coro is needed since otherwise the + # gathering task is done at the same time as the child future + def child_coro(): + return (yield from fut) + gather_future = asyncio.gather(child_coro(), loop=loop) + gather_task = asyncio.ensure_future(gather_future, loop=loop) + + cancel_result = None + def cancelling_callback(_): + nonlocal cancel_result + cancel_result = gather_task.cancel() + fut.add_done_callback(cancelling_callback) + + fut.set_result(42) # calls the cancelling_callback after fut is done() + + # At this point the task should complete. + loop.run_until_complete(gather_task) + + # Python issue #26923: asyncio.gather drops cancellation + self.assertEqual(cancel_result, False) + self.assertFalse(gather_task.cancelled()) + self.assertEqual(gather_task.result(), [42]) + class GatherTestsBase: diff -r 3908f432d0ac -r b0af901b1e2a Misc/NEWS --- a/Misc/NEWS Fri Oct 21 17:13:40 2016 -0400 +++ b/Misc/NEWS Fri Oct 21 17:23:35 2016 -0400 @@ -40,6 +40,10 @@ - Issue #28500: Fix asyncio to handle async gens GC from another thread. +- Issue #26923: Fix asyncio.Gather to refuse being cancelled once all + children are done. + Patch by Johannes Ebke. + Build -----