Skip to content

Commit 23d2c42

Browse files
committed
support eager_start kwarg in create_eager_task_factory
1 parent f7cc7d2 commit 23d2c42

File tree

5 files changed

+61
-7
lines changed

5 files changed

+61
-7
lines changed

Doc/library/asyncio-eventloop.rst

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -363,7 +363,7 @@ Creating Futures and Tasks
363363

364364
.. versionadded:: 3.5.2
365365

366-
.. method:: loop.create_task(coro, *, name=None, context=None)
366+
.. method:: loop.create_task(coro, *, name=None, context=None, eager_start=None)
367367

368368
Schedule the execution of :ref:`coroutine <coroutine>` *coro*.
369369
Return a :class:`Task` object.
@@ -379,12 +379,20 @@ Creating Futures and Tasks
379379
custom :class:`contextvars.Context` for the *coro* to run in.
380380
The current context copy is created when no *context* is provided.
381381

382+
An optional keyword-only *eager_start* argument allows specifying
383+
if the task should execute eagerly during the call to create_task,
384+
or be scheduled later. If the default ``None`` is passed the mode set
385+
by :meth:`loop.set_task_factory` will be used.
386+
382387
.. versionchanged:: 3.8
383388
Added the *name* parameter.
384389

385390
.. versionchanged:: 3.11
386391
Added the *context* parameter.
387392

393+
.. versionchanged:: next
394+
Added the *eager_start* parameter.
395+
388396
.. method:: loop.set_task_factory(factory)
389397

390398
Set a task factory that will be used by

Lib/asyncio/base_events.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -459,8 +459,7 @@ def create_future(self):
459459
return futures.Future(loop=self)
460460

461461
def create_task(self, coro, **kwargs):
462-
"""Schedule a coroutine object.
463-
462+
"""Schedule or begin executing a coroutine object.
464463
Return a task object.
465464
"""
466465
self._check_closed()

Lib/asyncio/tasks.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1008,9 +1008,9 @@ def create_eager_task_factory(custom_task_constructor):
10081008
used. E.g. `loop.set_task_factory(asyncio.eager_task_factory)`.
10091009
"""
10101010

1011-
def factory(loop, coro, *, name=None, context=None):
1011+
def factory(loop, coro, eager_start=True, **kwargs):
10121012
return custom_task_constructor(
1013-
coro, loop=loop, name=name, context=context, eager_start=True)
1013+
coro, loop=loop, eager_start=eager_start, **kwargs)
10141014

10151015
return factory
10161016

Lib/test/test_asyncio/test_eager_task_factory.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -263,6 +263,24 @@ async def run():
263263

264264
self.run_coro(run())
265265

266+
def test_eager_start_false(self):
267+
name = None
268+
269+
async def asyncfn():
270+
nonlocal name
271+
name = asyncio.current_task().get_name()
272+
273+
async def main():
274+
t = asyncio.get_running_loop().create_task(
275+
asyncfn(), eager_start=False, name="example"
276+
)
277+
self.assertFalse(t.done())
278+
self.assertIsNone(name)
279+
await t
280+
self.assertEqual(name, "example")
281+
282+
self.run_coro(main())
283+
266284

267285
class PyEagerTaskFactoryLoopTests(EagerTaskFactoryLoopTests, test_utils.TestCase):
268286
Task = tasks._PyTask

Lib/test/test_asyncio/test_tasks.py

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -89,8 +89,8 @@ class BaseTaskTests:
8989
Future = None
9090
all_tasks = None
9191

92-
def new_task(self, loop, coro, name='TestTask', context=None):
93-
return self.__class__.Task(coro, loop=loop, name=name, context=context)
92+
def new_task(self, loop, coro, name='TestTask', context=None, eager_start=None):
93+
return self.__class__.Task(coro, loop=loop, name=name, context=context, eager_start=eager_start)
9494

9595
def new_future(self, loop):
9696
return self.__class__.Future(loop=loop)
@@ -2667,6 +2667,35 @@ async def main():
26672667

26682668
self.assertEqual([None, 1, 2], ret)
26692669

2670+
def test_eager_start_true(self):
2671+
name = None
2672+
2673+
async def asyncfn():
2674+
nonlocal name
2675+
name = asyncio.current_task().get_name()
2676+
2677+
async def main():
2678+
t = self.new_task(coro=asyncfn(), loop=asyncio.get_running_loop(), eager_start=True, name="example")
2679+
self.assertTrue(t.done())
2680+
self.assertEqual(name, "example")
2681+
await t
2682+
2683+
def test_eager_start_false(self):
2684+
name = None
2685+
2686+
async def asyncfn():
2687+
nonlocal name
2688+
name = asyncio.current_task().get_name()
2689+
2690+
async def main():
2691+
t = self.new_task(coro=asyncfn(), loop=asyncio.get_running_loop(), eager_start=False, name="example")
2692+
self.assertFalse(t.done())
2693+
self.assertIsNone(name)
2694+
await t
2695+
self.assertEqual(name, "example")
2696+
2697+
asyncio.run(main(), loop_factory=asyncio.EventLoop)
2698+
26702699
def test_get_coro(self):
26712700
loop = asyncio.new_event_loop()
26722701
coro = coroutine_function()

0 commit comments

Comments
 (0)