https://hg.python.org/cpython/rev/6875b0bd3cd0 changeset: 99202:6875b0bd3cd0 branch: 3.5 parent: 99198:d64bb25cf797 parent: 99201:89d66f912671 user: Yury Selivanov <yselivanov at sprymix.com> date: Wed Nov 18 12:40:26 2015 -0500 summary: asyncio: Error if awaiting in parallel on the same coroutine See https://github.com/python/asyncio/pull/293 for details. files: Lib/asyncio/coroutines.py | 8 +++++- Lib/test/test_asyncio/test_pep492.py | 20 ++++++++++++++++ 2 files changed, 27 insertions(+), 1 deletions(-) diff --git a/Lib/asyncio/coroutines.py b/Lib/asyncio/coroutines.py --- a/Lib/asyncio/coroutines.py +++ b/Lib/asyncio/coroutines.py @@ -140,7 +140,13 @@ if compat.PY35: - __await__ = __iter__ # make compatible with 'await' expression + def __await__(self): + cr_await = getattr(self.gen, 'cr_await', None) + if cr_await is not None: + raise RuntimeError( + "Cannot await on coroutine {!r} while it's " + "awaiting for {!r}".format(self.gen, cr_await)) + return self @property def gi_yieldfrom(self): diff --git a/Lib/test/test_asyncio/test_pep492.py b/Lib/test/test_asyncio/test_pep492.py --- a/Lib/test/test_asyncio/test_pep492.py +++ b/Lib/test/test_asyncio/test_pep492.py @@ -203,6 +203,26 @@ self.loop.run_until_complete(runner()) + def test_double_await(self): + async def afunc(): + await asyncio.sleep(0.1, loop=self.loop) + + async def runner(): + coro = afunc() + t = asyncio.Task(coro, loop=self.loop) + try: + await asyncio.sleep(0, loop=self.loop) + await coro + finally: + t.cancel() + + self.loop.set_debug(True) + with self.assertRaisesRegex( + RuntimeError, + r'Cannot await.*test_double_await.*\bafunc\b.*while.*\bsleep\b'): + + self.loop.run_until_complete(runner()) + if __name__ == '__main__': unittest.main() -- Repository URL: https://hg.python.org/cpython
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4