From a6b180a71fb8cbc57cb06c711767ab30b25eb09a Mon Sep 17 00:00:00 2001 From: leojay Date: Mon, 27 Jul 2015 01:21:05 -0700 Subject: [PATCH] Issue #20319: concurrent.futures.wait() can block forever even if Futures have completed Applied https://github.com/python/cpython/commit/403f8cf425cd45a3ffcdd277091be465dce35532 --- concurrent/futures/_base.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/concurrent/futures/_base.py b/concurrent/futures/_base.py index fbf0275..2936c46 100644 --- a/concurrent/futures/_base.py +++ b/concurrent/futures/_base.py @@ -227,7 +227,8 @@ def as_completed(fs, timeout=None): finally: for f in fs: - f._waiters.remove(waiter) + with f._condition: + f._waiters.remove(waiter) DoneAndNotDoneFutures = collections.namedtuple( 'DoneAndNotDoneFutures', 'done not_done') @@ -274,7 +275,8 @@ def wait(fs, timeout=None, return_when=ALL_COMPLETED): waiter.event.wait(timeout) for f in fs: - f._waiters.remove(waiter) + with f._condition: + f._waiters.remove(waiter) done.update(waiter.finished_futures) return DoneAndNotDoneFutures(done, set(fs) - done)