Skip to content

create_task(name=...) silently fails to set name with custom task_factory after gh-128308 #132593

Closed as duplicate of#133745
@sergiosacj

Description

@sergiosacj

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

No one assigned

    Labels

    stdlibPython modules in the Lib dirtopic-asynciotype-bugAn unexpected behavior, bug, or error

    Projects

    Status

    Done

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions