[Python-checkins] cpython (merge 3.4 -> default): (Merge 3.4) Issue #21163, asyncio: Ignore "destroy pending task" warnings for

victor.stinner python-checkins at python.org
Wed Jul 16 18:38:42 CEST 2014


http://hg.python.org/cpython/rev/fbd3e9f635b6
changeset:   91695:fbd3e9f635b6
parent:      91693:c6091112648c
parent:      91694:6d5a76214166
user:        Victor Stinner <victor.stinner at gmail.com>
date:        Wed Jul 16 18:36:58 2014 +0200
summary:
  (Merge 3.4) Issue #21163, asyncio: Ignore "destroy pending task" warnings for
private tasks in gather().

files:
  Lib/asyncio/tasks.py |  34 +++++++++++++++++++++----------
  1 files changed, 23 insertions(+), 11 deletions(-)


diff --git a/Lib/asyncio/tasks.py b/Lib/asyncio/tasks.py
--- a/Lib/asyncio/tasks.py
+++ b/Lib/asyncio/tasks.py
@@ -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):

-- 
Repository URL: http://hg.python.org/cpython


More information about the Python-checkins mailing list