Сообщить об ошибке.

Функция as_completed() модуля concurrent.futures в Python

Возвращает результаты по мере завершения задач в потоках/процессах

Синтаксис:

import concurrent.futures as pool

pool.as_completed(fs, timeout=None)

Параметры:

  • fs - итерируемая последовательность объектов Future.
  • timeout=None - максимальное время ожидания завершения работы всех потоков/процессов.

Возвращаемое значение:

Описание:

Функция 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