summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVictor Stinner <victor.stinner@gmail.com>2014-06-30 12:51:04 (GMT)
committerVictor Stinner <victor.stinner@gmail.com>2014-06-30 12:51:04 (GMT)
commit98b6391fd4b27485b17c068d6f85a00d3f7c5ddc (patch)
tree849590cf0ff110524b68310217912f006bcb307b
parentb75380f3336db6dae82e8f75a2a5b020ae8fd377 (diff)
downloadcpython-98b6391fd4b27485b17c068d6f85a00d3f7c5ddc.zip
cpython-98b6391fd4b27485b17c068d6f85a00d3f7c5ddc.tar.gz
cpython-98b6391fd4b27485b17c068d6f85a00d3f7c5ddc.tar.bz2
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().
-rw-r--r--Lib/asyncio/base_events.py7
-rw-r--r--Lib/asyncio/tasks.py5
-rw-r--r--Lib/asyncio/test_utils.py3
3 files changed, 14 insertions, 1 deletions
diff --git a/Lib/asyncio/base_events.py b/Lib/asyncio/base_events.py
index b3d6e03..2230dc2 100644
--- a/Lib/asyncio/base_events.py
+++ b/Lib/asyncio/base_events.py
@@ -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)
diff --git a/Lib/asyncio/tasks.py b/Lib/asyncio/tasks.py
index 5b8f3eb..e9adf1d 100644
--- a/Lib/asyncio/tasks.py
+++ b/Lib/asyncio/tasks.py
@@ -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!',
diff --git a/Lib/asyncio/test_utils.py b/Lib/asyncio/test_utils.py
index 94054e7..ef3be23 100644
--- a/Lib/asyncio/test_utils.py
+++ b/Lib/asyncio/test_utils.py
@@ -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: