mirror of
https://github.com/python/cpython.git
synced 2025-08-27 12:16:04 +00:00
gh-103793: Defer formatting task name (#103767)
The default task name is "Task-<counter>" (if no name is passed in during Task creation). This is initialized in `Task.__init__` (C impl) using string formatting, which can be quite slow. Actually using the task name in real world code is not very common, so this is wasted init. Let's defer this string formatting to the first time the name is read (in `get_name` impl), so we don't need to pay the string formatting cost if the task name is never read. We don't change the order in which tasks are assigned numbers (if they are) -- the number is set on task creation, as a PyLong instead of a formatted string. Co-authored-by: Łukasz Langa <lukasz@langa.pl>
This commit is contained in:
parent
fbf3596c3e
commit
85c7bf5bce
4 changed files with 29 additions and 2 deletions
|
@ -399,6 +399,18 @@ class BaseTaskTests:
|
|||
self.loop.run_until_complete(t1)
|
||||
self.loop.run_until_complete(t2)
|
||||
|
||||
def test_task_set_name_pylong(self):
|
||||
# test that setting the task name to a PyLong explicitly doesn't
|
||||
# incorrectly trigger the deferred name formatting logic
|
||||
async def notmuch():
|
||||
return 123
|
||||
|
||||
t = self.new_task(self.loop, notmuch(), name=987654321)
|
||||
self.assertEqual(t.get_name(), '987654321')
|
||||
t.set_name(123456789)
|
||||
self.assertEqual(t.get_name(), '123456789')
|
||||
self.loop.run_until_complete(t)
|
||||
|
||||
def test_task_repr_name_not_str(self):
|
||||
async def notmuch():
|
||||
return 123
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue