summaryrefslogtreecommitdiff
path: root/Lib/concurrent
diff options
context:
space:
mode:
authorBrian Quinlan <brian@sweetapp.com>2014-02-01 11:49:04 +1100
committerBrian Quinlan <brian@sweetapp.com>2014-02-01 11:49:04 +1100
commit46d6937b335e48bb6f97ee792d7a6b32baec799d (patch)
tree19c2f7fe20da7103ac821fbd10b2faad422e7b35 /Lib/concurrent
parentec35c59b43c3e61a8e5761d0934ecdad12ba5ea6 (diff)
downloadcpython-46d6937b335e48bb6f97ee792d7a6b32baec799d.tar.gz
Issue #20319: concurrent.futures.wait() can block forever even if Futures have completed
Diffstat (limited to 'Lib/concurrent')
-rw-r--r--Lib/concurrent/futures/_base.py6
1 files changed, 4 insertions, 2 deletions
diff --git a/Lib/concurrent/futures/_base.py b/Lib/concurrent/futures/_base.py
index c3b1f017e0..acd05d0b2a 100644
--- a/Lib/concurrent/futures/_base.py
+++ b/Lib/concurrent/futures/_base.py
@@ -225,7 +225,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')
@@ -272,7 +273,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)