]> granicus.if.org Git - python/commitdiff
bpo-31641: Allow arbitrary iterables in `concurrent.futures.as_completed()` (#3830)
authorŁukasz Langa <lukasz@langa.pl>
Fri, 29 Sep 2017 21:33:34 +0000 (14:33 -0700)
committerGitHub <noreply@github.com>
Fri, 29 Sep 2017 21:33:34 +0000 (14:33 -0700)
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.

Lib/concurrent/futures/_base.py
Lib/test/test_concurrent_futures.py

index 70c7b6195931408e73aad3beae0c83f18f5dbf0a..6bace6c7464121c5869c7fee880ad5dcd02ece02 100644 (file)
@@ -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
index 57dc994d28477065e29b20f470eb05046bbd8284..e4c9ace93566156f20b43b52bfad7872c8fdeef0 100644 (file)
@@ -7,6 +7,7 @@ test.support.import_module('multiprocessing.synchronize')
 
 from test.support.script_helper import assert_python_ok
 
+import itertools
 import os
 import sys
 import threading
@@ -395,8 +396,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):