]> granicus.if.org Git - python/commitdiff
Issue #21163: BaseEventLoop.run_until_complete() and test_utils.run_briefly()
authorVictor Stinner <victor.stinner@gmail.com>
Mon, 30 Jun 2014 12:51:04 +0000 (14:51 +0200)
committerVictor Stinner <victor.stinner@gmail.com>
Mon, 30 Jun 2014 12:51:04 +0000 (14:51 +0200)
don't log the "destroy pending task" message anymore. The log is redundant for
run_until_complete() and useless in run_briefly().

Lib/asyncio/base_events.py
Lib/asyncio/tasks.py
Lib/asyncio/test_utils.py

index b3d6e0347598cbb6f3cf43857c8811bdc6827a4d..2230dc2c9cc4b54345a60cd3df5cd74b4b6c4a5c 100644 (file)
@@ -227,7 +227,14 @@ class BaseEventLoop(events.AbstractEventLoop):
         Return the Future's result, or raise its exception.
         """
         self._check_closed()
+
+        new_task = not isinstance(future, futures.Future)
         future = tasks.async(future, loop=self)
+        if new_task:
+            # An exception is raised if the future didn't complete, so there
+            # is no need to log the "destroy pending task" message
+            future._log_destroy_pending = False
+
         future.add_done_callback(_raise_stop_error)
         self.run_forever()
         future.remove_done_callback(_raise_stop_error)
index 5b8f3eb423ad6d6ffe25995678a219307973baf5..e9adf1dfb12aa9315166f962849dff14e599e34a 100644 (file)
@@ -75,13 +75,16 @@ class Task(futures.Future):
         self._must_cancel = False
         self._loop.call_soon(self._step)
         self.__class__._all_tasks.add(self)
+        # If False, don't log a message if the task is destroyed whereas its
+        # status is still pending
+        self._log_destroy_pending = True
 
     # On Python 3.3 or older, objects with a destructor part of a reference
     # cycle are never destroyed. It's not more the case on Python 3.4 thanks to
     # the PEP 442.
     if _PY34:
         def __del__(self):
-            if self._state == futures._PENDING:
+            if self._state == futures._PENDING and self._log_destroy_pending:
                 context = {
                     'task': self,
                     'message': 'Task was destroyed but it is pending!',
index 94054e70234cf766ff522e3d9eedda6d61ae83be..ef3be236de320bcb7432385cf85f24b40863fe52 100644 (file)
@@ -49,6 +49,9 @@ def run_briefly(loop):
         pass
     gen = once()
     t = tasks.Task(gen, loop=loop)
+    # Don't log a warning if the task is not done after run_until_complete().
+    # It occurs if the loop is stopped or if a task raises a BaseException.
+    t._log_destroy_pending = False
     try:
         loop.run_until_complete(t)
     finally: