changeset: 91695:fbd3e9f635b6 parent: 91693:c6091112648c parent: 91694:6d5a76214166 user: Victor Stinner date: Wed Jul 16 18:36:58 2014 +0200 description: (Merge 3.4) Issue #21163, asyncio: Ignore "destroy pending task" warnings for private tasks in gather(). diff -r c6091112648c -r fbd3e9f635b6 Lib/asyncio/tasks.py --- a/Lib/asyncio/tasks.py Wed Jul 16 18:03:26 2014 +0200 +++ b/Lib/asyncio/tasks.py Wed Jul 16 18:36:58 2014 +0200 @@ -558,21 +558,33 @@ prevent the cancellation of one child to cause other children to be cancelled.) """ - arg_to_fut = {arg: async(arg, loop=loop) for arg in set(coros_or_futures)} - children = [arg_to_fut[arg] for arg in coros_or_futures] - n = len(children) - if n == 0: + if not coros_or_futures: outer = futures.Future(loop=loop) outer.set_result([]) return outer - if loop is None: - loop = children[0]._loop - for fut in children: - if fut._loop is not loop: - raise ValueError("futures are tied to different event loops") + + arg_to_fut = {} + for arg in set(coros_or_futures): + if not isinstance(arg, futures.Future): + fut = async(arg, loop=loop) + if loop is None: + loop = fut._loop + # The caller cannot control this future, the "destroy pending task" + # warning should not be emitted. + fut._log_destroy_pending = False + else: + fut = arg + if loop is None: + loop = fut._loop + elif fut._loop is not loop: + raise ValueError("futures are tied to different event loops") + arg_to_fut[arg] = fut + + children = [arg_to_fut[arg] for arg in coros_or_futures] + nchildren = len(children) outer = _GatheringFuture(children, loop=loop) nfinished = 0 - results = [None] * n + results = [None] * nchildren def _done_callback(i, fut): nonlocal nfinished @@ -595,7 +607,7 @@ res = fut._result results[i] = res nfinished += 1 - if nfinished == n: + if nfinished == nchildren: outer.set_result(results) for i, fut in enumerate(children):