Skip to content

Commit cf5cfe3

Browse files
committed
simplify and comment
1 parent 89362f5 commit cf5cfe3

File tree

2 files changed

+29
-27
lines changed

2 files changed

+29
-27
lines changed

Lib/asyncio/base_events.py

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -463,24 +463,25 @@ def create_task(self, coro, *, name=None, context=None):
463463
464464
Return a task object.
465465
"""
466-
task = None
467-
try:
468-
self._check_closed()
469-
if self._task_factory is None:
470-
task = tasks.Task(coro, loop=self, name=name, context=context)
471-
if task._source_traceback:
472-
del task._source_traceback[-1]
466+
self._check_closed()
467+
if self._task_factory is None:
468+
task = tasks.Task(coro, loop=self, name=name, context=context)
469+
if task._source_traceback:
470+
del task._source_traceback[-1]
471+
else:
472+
if context is None:
473+
# Use legacy API if context is not needed
474+
task = self._task_factory(self, coro)
473475
else:
474-
if context is None:
475-
# Use legacy API if context is not needed
476-
task = self._task_factory(self, coro)
477-
else:
478-
task = self._task_factory(self, coro, context=context)
476+
task = self._task_factory(self, coro, context=context)
479477

480-
task.set_name(name)
478+
task.set_name(name)
481479

480+
try:
482481
return task
483482
finally:
483+
# gh-128552: prevent a refcycle of
484+
# task.exception().__traceback__->TaskGroup.create_task->task
484485
del task
485486

486487
def set_task_factory(self, factory):

Lib/asyncio/taskgroups.py

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -192,23 +192,24 @@ def create_task(self, coro, *, name=None, context=None):
192192
if self._aborting:
193193
coro.close()
194194
raise RuntimeError(f"TaskGroup {self!r} is shutting down")
195-
task = None
195+
if context is None:
196+
task = self._loop.create_task(coro, name=name)
197+
else:
198+
task = self._loop.create_task(coro, name=name, context=context)
199+
200+
# optimization: Immediately call the done callback if the task is
201+
# already done (e.g. if the coro was able to complete eagerly),
202+
# and skip scheduling a done callback
203+
if task.done():
204+
self._on_task_done(task)
205+
else:
206+
self._tasks.add(task)
207+
task.add_done_callback(self._on_task_done)
196208
try:
197-
if context is None:
198-
task = self._loop.create_task(coro, name=name)
199-
else:
200-
task = self._loop.create_task(coro, name=name, context=context)
201-
202-
# optimization: Immediately call the done callback if the task is
203-
# already done (e.g. if the coro was able to complete eagerly),
204-
# and skip scheduling a done callback
205-
if task.done():
206-
self._on_task_done(task)
207-
else:
208-
self._tasks.add(task)
209-
task.add_done_callback(self._on_task_done)
210209
return task
211210
finally:
211+
# gh-128552: prevent a refcycle of
212+
# task.exception().__traceback__->TaskGroup.create_task->task
212213
del task
213214

214215
# Since Python 3.8 Tasks propagate all exceptions correctly,

0 commit comments

Comments
 (0)