Skip to content

Commit

Permalink
bpo-26552: Fixed case where failing asyncio.ensure_future did not c…
Browse files Browse the repository at this point in the history
…lose the coroutine (#30288)
  • Loading branch information
kumaraditya303 authored Jan 28, 2022
1 parent 36f538c commit 24cc641
Show file tree
Hide file tree
Showing 3 changed files with 21 additions and 3 deletions.
10 changes: 8 additions & 2 deletions Lib/asyncio/tasks.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
13 changes: 12 additions & 1 deletion Lib/test/test_asyncio/test_base_events.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
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

Expand Down Expand Up @@ -796,6 +796,17 @@ def create_task(self, coro):
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
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Fixed case where failing :func:`asyncio.ensure_future` did not close the coroutine. Patch by Kumar Aditya.

0 comments on commit 24cc641

Please sign in to comment.