else:
task = self._loop.create_task(coro, context=context)
tasks._set_task_name(task, name)
- task.add_done_callback(self._on_task_done)
- self._tasks.add(task)
+ # optimization: Immediately call the done callback if the task is
+ # already done (e.g. if the coro was able to complete eagerly),
+ # and skip scheduling a done callback
+ if task.done():
+ self._on_task_done(task)
+ else:
+ self._tasks.add(task)
+ task.add_done_callback(self._on_task_done)
return task
# Since Python 3.8 Tasks propagate all exceptions correctly,