-
-
Notifications
You must be signed in to change notification settings - Fork 32.5k
gh-109955 : Update state transition comments for asyncio.Task #109910
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
Changes from 2 commits
3b9b4cf
3cc8ca9
e3f07bb
729a291
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -73,15 +73,27 @@ 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 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. | ||
# - 2a (_fut_waiter is None or _fut_waiter.done()), and __wakeup() is scheduled; | ||
# the Task is waiting for __wakeup() to be executed. | ||
# - 2b (_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 | ||
# The transition from 1 to 2a happens when _fut_waiter becomes done(), | ||
# as it schedules __wakeup() to be called. | ||
# The transition from 2a to 2b happens when __wakeup() is executed, | ||
# scheduling __step() to be called, leaving _fut_waiter in place. | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This confuses me. Once There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I may have got my wires crossed here, because it is all confusing. Initially, I thought __wakeup() was called directly (futures just calling registered callbacks) and _wakeup scheduling __step,.. But then it turns out that futures schedule their callbacks... I'll have another look. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Yes, you were right. So, there is no 2a or2b anymore just 2. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Yes, that's crucial information. |
||
# In state 1, one of the callbacks of __fut_waiter must be __wakeup(). | ||
# It transitions from 2b 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 | ||
|
||
|
Uh oh!
There was an error while loading. Please reload this page.