[Python-checkins] cpython (merge 3.4 -> default): (Merge 3.4) Issue #21163: BaseEventLoop.run_until_complete() and

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


http://hg.python.org/cpython/rev/2d0fa8f383c8
changeset: 91486:2d0fa8f383c8
parent: 91484:8dc8c93e74c9
parent: 91485:13e78b9cf290
user: Victor Stinner <victor.stinner at gmail.com>
date: Mon Jun 30 14:51:24 2014 +0200
summary:
 (Merge 3.4) 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

AltStyle によって変換されたページ (->オリジナル) /