Skip to content

[3.12] gh-109955 : Update state transition comments for asyncio.Task (GH-109910) #109992

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Oct 2, 2023
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 17 additions & 7 deletions Lib/asyncio/tasks.py
Original file line number Diff line number Diff line change
Expand Up @@ -86,15 +86,25 @@ class Task(futures._PyFuture): # Inherit Python Task implementation
"""A coroutine wrapped in a Future."""

# An important invariant maintained while a Task not done:
# _fut_waiter is either None or a Future. The Future
# can be either done() or not done().
# The task can be in any of 3 states:
#
# - Either _fut_waiter is None, and _step() is scheduled;
# - or _fut_waiter is some Future, and _step() is *not* scheduled.
# - 1: _fut_waiter is not None and not _fut_waiter.done():
# __step() is *not* scheduled and the Task is waiting for _fut_waiter.
# - 2: (_fut_waiter is None or _fut_waiter.done()) and __step() is scheduled:
# the Task is waiting for __step() to be executed.
# - 3: _fut_waiter is None and __step() is *not* scheduled:
# the Task is currently executing (in __step()).
#
# The only transition from the latter to the former is through
# _wakeup(). When _fut_waiter is not None, one of its callbacks
# must be _wakeup().

# If False, don't log a message if the task is destroyed whereas its
# * In state 1, one of the callbacks of __fut_waiter must be __wakeup().
# * The transition from 1 to 2 happens when _fut_waiter becomes done(),
# as it schedules __wakeup() to be called (which calls __step() so
# we way that __step() is scheduled).
# * It transitions from 2 to 3 when __step() is executed, and it clears
# _fut_waiter to None.

# If False, don't log a message if the task is destroyed while its
# status is still pending
_log_destroy_pending = True

Expand Down