Fix issue #20367: concurrent.futures.as_completed() for duplicate arguments.

Patch by Glenn Langford.
This commit is contained in:
Guido van Rossum 2014-01-26 09:57:51 -08:00
parent 252fd0c24b
commit e6994ff6e3
4 changed files with 16 additions and 3 deletions

View file

@ -181,7 +181,8 @@ def as_completed(fs, timeout=None):
Returns:
An iterator that yields the given Futures as they complete (finished or
cancelled).
cancelled). If any given Futures are duplicated, they will be returned
once.
Raises:
TimeoutError: If the entire result iterator could not be generated
@ -190,11 +191,12 @@ def as_completed(fs, timeout=None):
if timeout is not None:
end_time = timeout + time.time()
fs = set(fs)
with _AcquireFutures(fs):
finished = set(
f for f in fs
if f._state in [CANCELLED_AND_NOTIFIED, FINISHED])
pending = set(fs) - finished
pending = fs - finished
waiter = _create_and_install_waiters(fs, _AS_COMPLETED)
try: