Description
Bug report
Bug description:
During a rebuild of all packages in Debian unstable, the uvloop test suite failed due to a new behavior in asyncio.
This suite runs each test twice: once with uvloop implementation (which passes) and once with Python’s asyncio implementation (which fails).
Since
Commit: 38a99568763604ccec5d5027f0658100ad76876f
PR: https://github.com/python/cpython/pull/128768
asyncio.BaseEventLoop.create_task()
no longer calls set_name(name)
. This breaks compatibility with any factory that does not set the name manually.
Expected behavior
When using create_task(..., name="example name")
, the task's name should always be set - even when using a custom task factory - as it was before the regression.
Actual behavior
With a custom factory that returns a subclassed asyncio.Task
, the task name is None
unless the factory manually calls set_name(name)
. This is a silent behavioral change that breaks code relying on set_name()
being called by the event loop.
My Environment
Python version: 3.13.2
Debian testing
Script to reproduce
import asyncio
async def main():
names = []
async def get_name():
names.append(asyncio.current_task().get_name())
async with asyncio.TaskGroup() as tg:
tg.create_task(get_name(), name="example name")
print(names)
asyncio.run(main()) # Output: ['example name']
def factory():
loop = asyncio.new_event_loop()
loop.set_task_factory(asyncio.eager_task_factory)
return loop
asyncio.run(main(), loop_factory=factory) # Output: ['example name']
# Fails silently with custom task_factory
result = None
class MyTask(asyncio.Task):
def set_name(self, name):
global result
print(name) # never reached
result = name + "!"
def get_name(self):
global result
return result
def loop_factory():
loop = asyncio.new_event_loop()
loop.set_task_factory(asyncio.create_eager_task_factory(MyTask))
return loop
asyncio.run(main(), loop_factory=loop_factory) # Output: ['None']
CPython versions tested on:
3.13
Operating systems tested on:
Linux
Metadata
Metadata
Assignees
Projects
Status