summaryrefslogtreecommitdiffstats
path: root/Lib
diff options
context:
space:
mode:
authorKumar Aditya <59607654+kumaraditya303@users.noreply.github.com>2022-01-28 22:24:35 (GMT)
committerGitHub <noreply@github.com>2022-01-28 22:24:35 (GMT)
commit24cc6411adbfe5555ecd8901f1ea50caa414c908 (patch)
tree06358eb8f6d993efb986ddd590120e61d818e21d /Lib
parent36f538c8092eeb3d5b8bc9df0ae7cc348f08a865 (diff)
downloadcpython-24cc6411adbfe5555ecd8901f1ea50caa414c908.zip
cpython-24cc6411adbfe5555ecd8901f1ea50caa414c908.tar.gz
cpython-24cc6411adbfe5555ecd8901f1ea50caa414c908.tar.bz2
bpo-26552: Fixed case where failing `asyncio.ensure_future` did not close the coroutine (#30288)
Diffstat (limited to 'Lib')
-rw-r--r--Lib/asyncio/tasks.py10
-rw-r--r--Lib/test/test_asyncio/test_base_events.py13
2 files changed, 20 insertions, 3 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
diff --git a/Lib/test/test_asyncio/test_base_events.py b/Lib/test/test_asyncio/test_base_events.py
index 17e8396..c64e162 100644
--- a/Lib/test/test_asyncio/test_base_events.py
+++ b/Lib/test/test_asyncio/test_base_events.py
@@ -18,7 +18,7 @@ from test import support
from test.support.script_helper import assert_python_ok
from test.support import os_helper
from test.support import socket_helper
-
+import warnings
MOCK_ANY = mock.ANY
@@ -796,6 +796,17 @@ class BaseEventLoopTests(test_utils.TestCase):
task._log_destroy_pending = False
coro.close()
+ def test_create_task_error_closes_coro(self):
+ async def test():
+ pass
+ loop = asyncio.new_event_loop()
+ loop.close()
+ with warnings.catch_warnings(record=True) as w:
+ with self.assertRaises(RuntimeError):
+ asyncio.ensure_future(test(), loop=loop)
+ self.assertEqual(len(w), 0)
+
+
def test_create_named_task_with_default_factory(self):
async def test():
pass