mirror of
https://github.com/python/cpython
synced 2024-09-30 10:19:12 +00:00
gh-104144: Optimize gather to finish eagerly when all futures complete eagerly (#104138)
This commit is contained in:
parent
96f95df48e
commit
263abd333d
|
@ -813,6 +813,7 @@ def _done_callback(fut):
|
|||
children = []
|
||||
nfuts = 0
|
||||
nfinished = 0
|
||||
done_futs = []
|
||||
loop = None
|
||||
outer = None # bpo-46672
|
||||
for arg in coros_or_futures:
|
||||
|
@ -829,7 +830,10 @@ def _done_callback(fut):
|
|||
|
||||
nfuts += 1
|
||||
arg_to_fut[arg] = fut
|
||||
fut.add_done_callback(_done_callback)
|
||||
if fut.done():
|
||||
done_futs.append(fut)
|
||||
else:
|
||||
fut.add_done_callback(_done_callback)
|
||||
|
||||
else:
|
||||
# There's a duplicate Future object in coros_or_futures.
|
||||
|
@ -838,6 +842,13 @@ def _done_callback(fut):
|
|||
children.append(fut)
|
||||
|
||||
outer = _GatheringFuture(children, loop=loop)
|
||||
# Run done callbacks after GatheringFuture created so any post-processing
|
||||
# can be performed at this point
|
||||
# optimization: in the special case that *all* futures finished eagerly,
|
||||
# this will effectively complete the gather eagerly, with the last
|
||||
# callback setting the result (or exception) on outer before returning it
|
||||
for fut in done_futs:
|
||||
_done_callback(fut)
|
||||
return outer
|
||||
|
||||
|
||||
|
|
|
@ -0,0 +1,3 @@
|
|||
Optimize :func:`asyncio.gather` when using :func:`asyncio.eager_task_factory`
|
||||
to complete eagerly if all fututres completed eagerly.
|
||||
Avoid scheduling done callbacks for futures that complete eagerly.
|
Loading…
Reference in a new issue