If *factory* is ``None`` the default task factory will be set.
Otherwise, *factory* must be a *callable* with the signature matching
- ``(loop, coro, context=None)``, where *loop* is a reference to the active
+ ``(loop, coro, **kwargs)``, where *loop* is a reference to the active
event loop, and *coro* is a coroutine object. The callable
- must return a :class:`asyncio.Future`-compatible object.
+ must pass on all *kwargs*, and return a :class:`asyncio.Task`-compatible object.
.. method:: loop.get_task_factory()
"""Create a Future object attached to the loop."""
return futures.Future(loop=self)
- def create_task(self, coro, *, name=None, context=None):
+ def create_task(self, coro, **kwargs):
"""Schedule a coroutine object.
Return a task object.
"""
self._check_closed()
- if self._task_factory is None:
- task = tasks.Task(coro, loop=self, name=name, context=context)
- if task._source_traceback:
- del task._source_traceback[-1]
- else:
- if context is None:
- # Use legacy API if context is not needed
- task = self._task_factory(self, coro)
- else:
- task = self._task_factory(self, coro, context=context)
-
- task.set_name(name)
+ if self._task_factory is not None:
+ return self._task_factory(self, coro, **kwargs)
+ task = tasks.Task(coro, loop=self, **kwargs)
+ if task._source_traceback:
+ del task._source_traceback[-1]
try:
return task
finally:
If factory is None the default task factory will be set.
If factory is a callable, it should have a signature matching
- '(loop, coro)', where 'loop' will be a reference to the active
- event loop, 'coro' will be a coroutine object. The callable
- must return a Future.
+ '(loop, coro, **kwargs)', where 'loop' will be a reference to the active
+ event loop, 'coro' will be a coroutine object, and **kwargs will be
+ arbitrary keyword arguments that should be passed on to Task.
+ The callable must return a Task.
"""
if factory is not None and not callable(factory):
raise TypeError('task factory must be a callable or None')
# Method scheduling a coroutine object: create a task.
- def create_task(self, coro, *, name=None, context=None):
+ def create_task(self, coro, **kwargs):
raise NotImplementedError
# Methods for interacting with threads.
loop.close()
def test_create_named_task_with_custom_factory(self):
- def task_factory(loop, coro):
- return asyncio.Task(coro, loop=loop)
+ def task_factory(loop, coro, **kwargs):
+ return asyncio.Task(coro, loop=loop, **kwargs)
async def test():
pass
self.run_coro(run())
+ def test_name(self):
+ name = None
+ async def coro():
+ nonlocal name
+ name = asyncio.current_task().get_name()
+
+ async def main():
+ task = self.loop.create_task(coro(), name="test name")
+ self.assertEqual(name, "test name")
+ await task
+
+ self.run_coro(coro())
class AsyncTaskCounter:
def __init__(self, loop, *, task_class, eager):
# cancellation happens here and error is more understandable
await asyncio.sleep(0)
+ async def test_name(self):
+ name = None
+
+ async def asyncfn():
+ nonlocal name
+ name = asyncio.current_task().get_name()
+
+ async with asyncio.TaskGroup() as tg:
+ tg.create_task(asyncfn(), name="example name")
+
+ self.assertEqual(name, "example name")
+
class TestTaskGroup(BaseTestTaskGroup, unittest.IsolatedAsyncioTestCase):
loop_factory = asyncio.EventLoop
--- /dev/null
+Support the *name* keyword argument for eager tasks in :func:`asyncio.loop.create_task`, :func:`asyncio.create_task` and :func:`asyncio.TaskGroup.create_task`, by passing on all *kwargs* to the task factory set by :func:`asyncio.loop.set_task_factory`.