https://github.com/python/cpython/commit/74f4b06958eabfb0619b6f53c352397e52a75949
commit: 74f4b06958eabfb0619b6f53c352397e52a75949
branch: main
author: Thomas Grainger <[email protected]>
committer: kumaraditya303 <[email protected]>
date: 2026-07-24T14:40:25Z
summary:
gh-145107: simplify asyncio staggered race using eager_start=False (#145108)
files:
A Misc/NEWS.d/next/Library/2026-02-22-11-27-57.gh-issue-145107.ZlQXEZ.rst
M Lib/asyncio/staggered.py
diff --git a/Lib/asyncio/staggered.py b/Lib/asyncio/staggered.py
index 845aed4c6a3b35..b9e7b9eb29594f 100644
--- a/Lib/asyncio/staggered.py
+++ b/Lib/asyncio/staggered.py
@@ -90,11 +90,7 @@ def task_done(task):
return
unhandled_exceptions.append(exc)
- async def run_one_coro(ok_to_start, previous_failed) -> None:
- # in eager tasks this waits for the calling task to append this task
- # to running_tasks, in regular tasks this wait is a no-op that does
- # not yield a future. See gh-124309.
- await ok_to_start.wait()
+ async def run_one_coro(previous_failed) -> None:
# Wait for the previous task to finish, or for delay seconds
if previous_failed is not None:
with contextlib.suppress(exceptions_mod.TimeoutError):
@@ -110,14 +106,13 @@ async def run_one_coro(ok_to_start, previous_failed) ->
None:
return
# Start task that will run the next coroutine
this_failed = locks.Event()
- next_ok_to_start = locks.Event()
- next_task = loop.create_task(run_one_coro(next_ok_to_start,
this_failed))
+ next_task = loop.create_task(
+ run_one_coro(this_failed),
+ eager_start=False,
+ )
futures.future_add_to_awaited_by(next_task, parent_task)
running_tasks.add(next_task)
next_task.add_done_callback(task_done)
- # next_task has been appended to running_tasks so next_task is ok to
- # start.
- next_ok_to_start.set()
# Prepare place to put this coroutine's exceptions if not won
exceptions.append(None)
assert len(exceptions) == this_index + 1
@@ -149,13 +144,11 @@ async def run_one_coro(ok_to_start, previous_failed) ->
None:
propagate_cancellation_error = None
try:
- ok_to_start = locks.Event()
- first_task = loop.create_task(run_one_coro(ok_to_start, None))
+ first_task = loop.create_task(run_one_coro(None), eager_start=False)
futures.future_add_to_awaited_by(first_task, parent_task)
running_tasks.add(first_task)
first_task.add_done_callback(task_done)
- # first_task has been appended to running_tasks so first_task is ok to
start.
- ok_to_start.set()
+ # first_task has been appended to running_tasks before the event loop
starts running it.
propagate_cancellation_error = None
# Make sure no tasks are left running if we leave this function
while running_tasks:
diff --git
a/Misc/NEWS.d/next/Library/2026-02-22-11-27-57.gh-issue-145107.ZlQXEZ.rst
b/Misc/NEWS.d/next/Library/2026-02-22-11-27-57.gh-issue-145107.ZlQXEZ.rst
new file mode 100644
index 00000000000000..c15afb53d6db4a
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2026-02-22-11-27-57.gh-issue-145107.ZlQXEZ.rst
@@ -0,0 +1 @@
+Simplify ``asyncio.staggered_race`` by using ``eager_start=False``.
_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3//lists/python-checkins.python.org
Member address: [email protected]