From 2dba23af7145f3edc608dc16209e6ead38c0f6c8 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Thu, 3 Jul 2014 00:59:00 +0200 Subject: [PATCH] asyncio: sync with Tulip * _UnixSubprocessTransport: fix file mode of stdin. Open stdin in write mode, not in read mode * Examples: close the event loop at exit * More reliable CoroWrapper.__del__. If the constructor is interrupted by KeyboardInterrupt or the coroutine objet is destroyed lately, some the _source_traceback attribute doesn't exist anymore. * repr(Task): include also the future the task is waiting for --- Lib/asyncio/coroutines.py | 14 ++++++++------ Lib/asyncio/tasks.py | 3 +++ Lib/asyncio/unix_events.py | 2 +- Lib/test/test_asyncio/test_tasks.py | 11 +++++++++++ 4 files changed, 23 insertions(+), 7 deletions(-) diff --git a/Lib/asyncio/coroutines.py b/Lib/asyncio/coroutines.py index cdb1ea8d889..71a1ec4dd0e 100644 --- a/Lib/asyncio/coroutines.py +++ b/Lib/asyncio/coroutines.py @@ -111,12 +111,14 @@ class CoroWrapper: frame = getattr(gen, 'gi_frame', None) if frame is not None and frame.f_lasti == -1: func = events._format_callback(self.func, ()) - tb = ''.join(traceback.format_list(self._source_traceback)) - message = ('Coroutine %s was never yielded from\n' - 'Coroutine object created at (most recent call last):\n' - '%s' - % (func, tb.rstrip())) - logger.error(message) + msg = 'Coroutine %s was never yielded from' % func + tb = getattr(self, '_source_traceback', ()) + if tb: + tb = ''.join(traceback.format_list(tb)) + msg += ('\nCoroutine object created at ' + '(most recent call last):\n') + msg += tb.rstrip() + logger.error(msg) def coroutine(func): diff --git a/Lib/asyncio/tasks.py b/Lib/asyncio/tasks.py index e9adf1dfb12..dd191e770be 100644 --- a/Lib/asyncio/tasks.py +++ b/Lib/asyncio/tasks.py @@ -109,6 +109,9 @@ class Task(futures.Future): if self._callbacks: info.append(self._format_callbacks()) + if self._fut_waiter is not None: + info.append('wait_for=%r' % self._fut_waiter) + return '<%s %s>' % (self.__class__.__name__, ' '.join(info)) def get_stack(self, *, limit=None): diff --git a/Lib/asyncio/unix_events.py b/Lib/asyncio/unix_events.py index 1cb70ffafbf..5f728b5728a 100644 --- a/Lib/asyncio/unix_events.py +++ b/Lib/asyncio/unix_events.py @@ -494,7 +494,7 @@ class _UnixSubprocessTransport(base_subprocess.BaseSubprocessTransport): universal_newlines=False, bufsize=bufsize, **kwargs) if stdin_w is not None: stdin.close() - self._proc.stdin = open(stdin_w.detach(), 'rb', buffering=bufsize) + self._proc.stdin = open(stdin_w.detach(), 'wb', buffering=bufsize) class AbstractChildWatcher: diff --git a/Lib/test/test_asyncio/test_tasks.py b/Lib/test/test_asyncio/test_tasks.py index c64e1ef5f7c..83b7e61fdb9 100644 --- a/Lib/test/test_asyncio/test_tasks.py +++ b/Lib/test/test_asyncio/test_tasks.py @@ -218,6 +218,17 @@ class TaskTests(test_utils.TestCase): '()]>' % coro) self.loop.run_until_complete(t) + def test_task_repr_wait_for(self): + @asyncio.coroutine + def wait_for(fut): + return (yield from fut) + + fut = asyncio.Future(loop=self.loop) + task = asyncio.Task(wait_for(fut), loop=self.loop) + test_utils.run_briefly(self.loop) + self.assertRegex(repr(task), + '' % re.escape(repr(fut))) + def test_task_basics(self): @asyncio.coroutine def outer():