Skip to content

Commit 726a75d

Browse files
committed
feat: support eager_start kwarg
1 parent 6cd24cb commit 726a75d

3 files changed

Lines changed: 62 additions & 8 deletions

File tree

‎tests/test_base.py‎

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -604,6 +604,36 @@ def factory(loop, coro, **kwargs):
604604
self.loop.set_task_factory(None)
605605
self.assertIsNone(self.loop.get_task_factory())
606606

607+
@unittest.skipUnless(
608+
sys.version_info >= (3, 13),
609+
"loop.create_task with eager_start requires Python 3.13+",
610+
)
611+
def test_loop_create_task_eager_start(self):
612+
async def coro():
613+
return "eager"
614+
615+
async def main():
616+
task = self.loop.create_task(coro(), eager_start=True)
617+
self.assertTrue(task.done())
618+
self.assertEqual(task.result(), "eager")
619+
620+
self.loop.run_until_complete(main())
621+
622+
@unittest.skipUnless(
623+
sys.version_info >= (3, 14),
624+
"asyncio.create_task with eager_start requires Python 3.14+",
625+
)
626+
def test_asyncio_create_task_eager_start(self):
627+
async def coro():
628+
return "eager"
629+
630+
async def main():
631+
task = asyncio.create_task(coro(), eager_start=True)
632+
self.assertTrue(task.done())
633+
self.assertEqual(task.result(), "eager")
634+
635+
self.loop.run_until_complete(main())
636+
607637
def test_shutdown_asyncgens_01(self):
608638
finalized = list()
609639

‎uvloop/loop.pyi‎

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import asyncio
2+
import contextvars
23
import ssl
34
import sys
45
from socket import AddressFamily, SocketKind, _Address, _RetAddress, socket
@@ -46,12 +47,30 @@ class Loop:
4647
def is_running(self) -> bool: ...
4748
def is_closed(self) -> bool: ...
4849
def create_future(self) -> asyncio.Future[Any]: ...
49-
def create_task(
50-
self,
51-
coro: Union[Awaitable[_T], Generator[Any, None, _T]],
52-
*,
53-
name: Optional[str] = ...,
54-
) -> asyncio.Task[_T]: ...
50+
if sys.version_info >= (3, 13):
51+
def create_task(
52+
self,
53+
coro: Union[Awaitable[_T], Generator[Any, None, _T]],
54+
*,
55+
name: Optional[str] = ...,
56+
context: Optional[contextvars.Context] = ...,
57+
eager_start: Optional[bool] = ...,
58+
) -> asyncio.Task[_T]: ...
59+
elif sys.version_info >= (3, 11):
60+
def create_task(
61+
self,
62+
coro: Union[Awaitable[_T], Generator[Any, None, _T]],
63+
*,
64+
name: Optional[str] = ...,
65+
context: Optional[contextvars.Context] = ...,
66+
) -> asyncio.Task[_T]: ...
67+
else:
68+
def create_task(
69+
self,
70+
coro: Union[Awaitable[_T], Generator[Any, None, _T]],
71+
*,
72+
name: Optional[str] = ...,
73+
) -> asyncio.Task[_T]: ...
5574
def set_task_factory(
5675
self,
5776
factory: Optional[

‎uvloop/loop.pyx‎

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1404,7 +1404,7 @@ cdef class Loop:
14041404
"""Create a Future object attached to the loop."""
14051405
return self._new_future()
14061406

1407-
def create_task(self, coro, *, name=None, context=None):
1407+
def create_task(self, coro, *, name=None, context=None, eager_start=None):
14081408
"""Schedule a coroutine object.
14091409
14101410
Return a task object.
@@ -1417,7 +1417,12 @@ cdef class Loop:
14171417
created when no context is provided.
14181418
"""
14191419
self._check_closed()
1420-
if PY311:
1420+
if PY313:
1421+
if self._task_factory is None:
1422+
task = aio_Task(coro, loop=self, context=context, eager_start=eager_start)
1423+
else:
1424+
task = self._task_factory(self, coro, context=context, eager_start=eager_start)
1425+
elif PY311:
14211426
if self._task_factory is None:
14221427
task = aio_Task(coro, loop=self, context=context)
14231428
else:

0 commit comments

Comments
 (0)