[Python-checkins] cpython (3.4): Issue #21163: BaseEventLoop.run_until_complete() and test_utils.run_briefly()

victor.stinner python-checkins at python.org
Mon Jun 30 14:53:53 CEST 2014


http://hg.python.org/cpython/rev/13e78b9cf290
changeset:   91485:13e78b9cf290
branch:      3.4
parent:      91483:defd09a5339a
user:        Victor Stinner <victor.stinner at gmail.com>
date:        Mon Jun 30 14:51:04 2014 +0200
summary:
  Issue #21163: BaseEventLoop.run_until_complete() and test_utils.run_briefly()
don't log the "destroy pending task" message anymore. The log is redundant for
run_until_complete() and useless in run_briefly().

files:
  Lib/asyncio/base_events.py |  7 +++++++
  Lib/asyncio/tasks.py       |  5 ++++-
  Lib/asyncio/test_utils.py  |  3 +++
  3 files changed, 14 insertions(+), 1 deletions(-)


diff --git a/Lib/asyncio/base_events.py b/Lib/asyncio/base_events.py
--- a/Lib/asyncio/base_events.py
+++ b/Lib/asyncio/base_events.py
@@ -227,7 +227,14 @@
         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)
diff --git a/Lib/asyncio/tasks.py b/Lib/asyncio/tasks.py
--- a/Lib/asyncio/tasks.py
+++ b/Lib/asyncio/tasks.py
@@ -75,13 +75,16 @@
         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!',
diff --git a/Lib/asyncio/test_utils.py b/Lib/asyncio/test_utils.py
--- a/Lib/asyncio/test_utils.py
+++ b/Lib/asyncio/test_utils.py
@@ -49,6 +49,9 @@
         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:

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


More information about the Python-checkins mailing list