diff options
author | Kumar Aditya <59607654+kumaraditya303@users.noreply.github.com> | 2022-01-29 06:57:18 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-01-29 06:57:18 (GMT) |
commit | a5451c96a14ac0c3ee7cef7b5c52ab1d783ec613 (patch) | |
tree | ac6a1a6c725b3945dcb6ca3fe3f91fa6aebf4110 /Lib/asyncio | |
parent | 315a60acd14dd730b2081574c09ccc29e92ee687 (diff) | |
download | cpython-a5451c96a14ac0c3ee7cef7b5c52ab1d783ec613.zip cpython-a5451c96a14ac0c3ee7cef7b5c52ab1d783ec613.tar.gz cpython-a5451c96a14ac0c3ee7cef7b5c52ab1d783ec613.tar.bz2 |
bpo-26552: Fixed case where failing `asyncio.ensure_future` did not close the coroutine (#30288) (#31003)
Diffstat (limited to 'Lib/asyncio')
-rw-r--r-- | Lib/asyncio/tasks.py | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/Lib/asyncio/tasks.py b/Lib/asyncio/tasks.py index 445a9f5..2bee5c0 100644 --- a/Lib/asyncio/tasks.py +++ b/Lib/asyncio/tasks.py @@ -621,17 +621,23 @@ def _ensure_future(coro_or_future, *, loop=None): raise ValueError('The future belongs to a different loop than ' 'the one specified as the loop argument') return coro_or_future - + called_wrap_awaitable = False if not coroutines.iscoroutine(coro_or_future): if inspect.isawaitable(coro_or_future): coro_or_future = _wrap_awaitable(coro_or_future) + called_wrap_awaitable = True else: raise TypeError('An asyncio.Future, a coroutine or an awaitable ' 'is required') if loop is None: loop = events._get_event_loop(stacklevel=4) - return loop.create_task(coro_or_future) + try: + return loop.create_task(coro_or_future) + except RuntimeError: + if not called_wrap_awaitable: + coro_or_future.close() + raise @types.coroutine |