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
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
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