summaryrefslogtreecommitdiff
path: root/asyncio/tasks.py
diff options
context:
space:
mode:
authorVictor Stinner <victor.stinner@gmail.com>2014-07-16 18:35:33 +0200
committerVictor Stinner <victor.stinner@gmail.com>2014-07-16 18:35:33 +0200
commit0c18e36da4dd14bd3094f1112d75e3a11097d7b8 (patch)
treeef28fdd89a301585040ab5e41597537d7d34e26b /asyncio/tasks.py
parent5288b702db06f02cd61ba0c39a5886cf0123c534 (diff)
downloadtrollius-0c18e36da4dd14bd3094f1112d75e3a11097d7b8.tar.gz
Python issue 21163: Ignore "destroy pending task" warnings for private tasks in
asyncio.gather().
Diffstat (limited to 'asyncio/tasks.py')
-rw-r--r--asyncio/tasks.py34
1 files changed, 23 insertions, 11 deletions
diff --git a/asyncio/tasks.py b/asyncio/tasks.py
index 78b4c4d..a741bd3 100644
--- a/asyncio/tasks.py
+++ b/asyncio/tasks.py
@@ -558,21 +558,33 @@ def gather(*coros_or_futures, loop=None, return_exceptions=False):
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 @@ def gather(*coros_or_futures, loop=None, return_exceptions=False):
res = fut._result
results[i] = res
nfinished += 1
- if nfinished == n:
+ if nfinished == nchildren:
outer.set_result(results)
for i, fut in enumerate(children):