diff options
author | Victor Stinner <victor.stinner@gmail.com> | 2014-07-02 22:59:00 (GMT) |
---|---|---|
committer | Victor Stinner <victor.stinner@gmail.com> | 2014-07-02 22:59:00 (GMT) |
commit | 2dba23af7145f3edc608dc16209e6ead38c0f6c8 (patch) | |
tree | 0eec0e78f459221e1c2d269351d7b9e4aa5755ff | |
parent | e10920f0d1009ea33ce4b35b015a928b33a80867 (diff) | |
download | cpython-2dba23af7145f3edc608dc16209e6ead38c0f6c8.zip cpython-2dba23af7145f3edc608dc16209e6ead38c0f6c8.tar.gz cpython-2dba23af7145f3edc608dc16209e6ead38c0f6c8.tar.bz2 |
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
-rw-r--r-- | Lib/asyncio/coroutines.py | 14 | ||||
-rw-r--r-- | Lib/asyncio/tasks.py | 3 | ||||
-rw-r--r-- | Lib/asyncio/unix_events.py | 2 | ||||
-rw-r--r-- | 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 cdb1ea8..71a1ec4 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 e9adf1d..dd191e7 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 1cb70ff..5f728b5 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 c64e1ef..83b7e61 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): '<Task pending %s cb=[<Dummy>()]>' % 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), + '<Task .* wait_for=%s>' % re.escape(repr(fut))) + def test_task_basics(self): @asyncio.coroutine def outer(): |