import concurrent.futures as pool pool.as_completed(fs, timeout=None)
fs
- итерируемая последовательность объектов Future
.timeout=None
- максимальное время ожидания завершения работы всех потоков/процессов.Future
.Функция as_completed()
модуля concurrent.futures
возвращает итератор по экземплярам Future
(возможно, созданным разными экземплярами Executor
), заданным fs
, который возвращает объекты Future
по мере их завершения (завершенные или отмененные).
Future
, заданные аргументом fs
, будут возвращены один раз. Future
, которые завершились до вызова функции as_completed()
, будут переданы первыми. Возвращаемый итератор вызывает ошибку TimeoutError
, если вызывается метод __next__()
, а результат недоступен после истечения тайм-аута timeout
(в секундах) от исходного вызова as_completed()
.
Аргумент timeout
может быть int
или float
. Если timeout
не указан или равен None
, то время ожидания не ограничено.
as_completed()
.import concurrent.futures as pool import time def worker(a, b): time.sleep(0.5) return a / b # данные для worker() data = [(1, 0.3), (2, 0.7), (3, 9), (4, 3)] # создаем пул из 3-х потоков with pool.ThreadPoolExecutor(max_workers=3) as executor: # создаем список заданий (вызовы worker() с аргументами из data) # для потоков (список объектов 'Future'), # которые встают в очередь на выполнение futures = [executor.submit(worker, a, b) for a, b in data] # в функцию `as_completed` передаем список (очередь) # созданных заданий, которая в свою очередь # выдает итератор с уже завершенными 'Future' for future in pool.as_completed(futures): # получаем результат result = future.result() print(f'Результат {result}') # Результат 3.3333333333333335 # Результат 2.857142857142857 # Результат 0.3333333333333333 # Результат 1.3333333333333333