Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 30 additions & 0 deletions tests/test_base.py
Original file line number Diff line number Diff line change
Expand Up @@ -604,6 +604,36 @@ def factory(loop, coro, **kwargs):
self.loop.set_task_factory(None)
self.assertIsNone(self.loop.get_task_factory())

@unittest.skipUnless(
sys.version_info >= (3, 13),
"loop.create_task with eager_start requires Python 3.13+",
)
def test_loop_create_task_eager_start(self):
async def coro():
return "eager"

async def main():
task = self.loop.create_task(coro(), eager_start=True)
self.assertTrue(task.done())
self.assertEqual(task.result(), "eager")

self.loop.run_until_complete(main())

@unittest.skipUnless(
sys.version_info >= (3, 14),
"asyncio.create_task with eager_start requires Python 3.14+",
)
def test_asyncio_create_task_eager_start(self):
async def coro():
return "eager"

async def main():
task = asyncio.create_task(coro(), eager_start=True)
self.assertTrue(task.done())
self.assertEqual(task.result(), "eager")

self.loop.run_until_complete(main())

def test_shutdown_asyncgens_01(self):
finalized = list()

Expand Down
31 changes: 25 additions & 6 deletions uvloop/loop.pyi
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import asyncio
import contextvars
import ssl
import sys
from socket import AddressFamily, SocketKind, _Address, _RetAddress, socket
Expand Down Expand Up @@ -46,12 +47,30 @@ class Loop:
def is_running(self) -> bool: ...
def is_closed(self) -> bool: ...
def create_future(self) -> asyncio.Future[Any]: ...
def create_task(
self,
coro: Union[Awaitable[_T], Generator[Any, None, _T]],
*,
name: Optional[str] = ...,
) -> asyncio.Task[_T]: ...
if sys.version_info >= (3, 13):
def create_task(
self,
coro: Union[Awaitable[_T], Generator[Any, None, _T]],
*,
name: Optional[str] = ...,
context: Optional[contextvars.Context] = ...,
eager_start: Optional[bool] = ...,
) -> asyncio.Task[_T]: ...
elif sys.version_info >= (3, 11):
def create_task(
self,
coro: Union[Awaitable[_T], Generator[Any, None, _T]],
*,
name: Optional[str] = ...,
context: Optional[contextvars.Context] = ...,
) -> asyncio.Task[_T]: ...
else:
def create_task(
self,
coro: Union[Awaitable[_T], Generator[Any, None, _T]],
*,
name: Optional[str] = ...,
) -> asyncio.Task[_T]: ...
def set_task_factory(
self,
factory: Optional[
Expand Down
9 changes: 7 additions & 2 deletions uvloop/loop.pyx
Original file line number Diff line number Diff line change
Expand Up @@ -1404,7 +1404,7 @@ cdef class Loop:
"""Create a Future object attached to the loop."""
return self._new_future()

def create_task(self, coro, *, name=None, context=None):
def create_task(self, coro, *, name=None, context=None, eager_start=None):
"""Schedule a coroutine object.

Return a task object.
Expand All @@ -1417,7 +1417,12 @@ cdef class Loop:
created when no context is provided.
"""
self._check_closed()
if PY311:
if PY313:
if self._task_factory is None:
task = aio_Task(coro, loop=self, context=context, eager_start=eager_start)
else:
task = self._task_factory(self, coro, context=context, eager_start=eager_start)
elif PY311:
if self._task_factory is None:
task = aio_Task(coro, loop=self, context=context)
else:
Expand Down
Loading