summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>2017-09-29 22:07:01 (GMT)
committerNed Deily <nad@python.org>2017-10-03 00:32:03 (GMT)
commit2e3fd03796528a9f88f79d38e1d890af153c8e61 (patch)
tree8d684e889321489d0183d8f10f8d62a4d887ea10
parenta74ce09c738c3e3aa89994bf31049cb914dca389 (diff)
downloadcpython-2e3fd03796528a9f88f79d38e1d890af153c8e61.zip
cpython-2e3fd03796528a9f88f79d38e1d890af153c8e61.tar.gz
cpython-2e3fd03796528a9f88f79d38e1d890af153c8e61.tar.bz2
[3.6] bpo-31641: Allow arbitrary iterables in `concurrent.futures.as_completed()` (GH-3830) (#3831)
This was possible before. GH-1560 introduced a regression after 3.6.2 got released where only sequences were accepted now. This commit addresses this problem. (cherry picked from commit 574562c5ddb2f0429aab9af762442e6f9a3f26ab)
-rw-r--r--Lib/concurrent/futures/_base.py3
-rw-r--r--Lib/test/test_concurrent_futures.py6
2 files changed, 6 insertions, 3 deletions
diff --git a/Lib/concurrent/futures/_base.py b/Lib/concurrent/futures/_base.py
index 70c7b61..6bace6c 100644
--- a/Lib/concurrent/futures/_base.py
+++ b/Lib/concurrent/futures/_base.py
@@ -214,9 +214,8 @@ def as_completed(fs, timeout=None):
if timeout is not None:
end_time = timeout + time.time()
- total_futures = len(fs)
-
fs = set(fs)
+ total_futures = len(fs)
with _AcquireFutures(fs):
finished = set(
f for f in fs
diff --git a/Lib/test/test_concurrent_futures.py b/Lib/test/test_concurrent_futures.py
index 6678784..5ddce09 100644
--- a/Lib/test/test_concurrent_futures.py
+++ b/Lib/test/test_concurrent_futures.py
@@ -11,6 +11,7 @@ test.support.import_module('threading')
from test.support.script_helper import assert_python_ok
+import itertools
import os
import sys
import threading
@@ -399,8 +400,11 @@ class AsCompletedTests:
def test_duplicate_futures(self):
# Issue 20367. Duplicate futures should not raise exceptions or give
# duplicate responses.
+ # Issue #31641: accept arbitrary iterables.
future1 = self.executor.submit(time.sleep, 2)
- completed = [f for f in futures.as_completed([future1,future1])]
+ completed = [
+ f for f in futures.as_completed(itertools.repeat(future1, 3))
+ ]
self.assertEqual(len(completed), 1)
def test_free_reference_yielded_future(self):