diff options
author | Victor Stinner <victor.stinner@gmail.com> | 2014-06-30 12:51:24 (GMT) |
---|---|---|
committer | Victor Stinner <victor.stinner@gmail.com> | 2014-06-30 12:51:24 (GMT) |
commit | b1f9ed75bda20fdb0cdc7902cbae1de1f994ad3a (patch) | |
tree | 85e10c7c34a51b7026643784e17059e16d567821 /Lib | |
parent | 91dd20ba6050181d454a6854137ea3534ac1f3d9 (diff) | |
parent | 98b6391fd4b27485b17c068d6f85a00d3f7c5ddc (diff) | |
download | cpython-b1f9ed75bda20fdb0cdc7902cbae1de1f994ad3a.zip cpython-b1f9ed75bda20fdb0cdc7902cbae1de1f994ad3a.tar.gz cpython-b1f9ed75bda20fdb0cdc7902cbae1de1f994ad3a.tar.bz2 |
(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().
Diffstat (limited to 'Lib')
-rw-r--r-- | Lib/asyncio/base_events.py | 7 | ||||
-rw-r--r-- | Lib/asyncio/tasks.py | 5 | ||||
-rw-r--r-- | 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 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: |