concurrent.futures.md
1> **Источник:** https://python-all.ru/3.10/library/concurrent.futures.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# [`concurrent.futures`](https://python-all.ru/3.10/library/concurrent.futures.html#module-concurrent.futures) – Запуск параллельных задач89Новое в версии 3.2.1011**Исходный код:** [Lib/concurrent/futures/thread.py](https://python-all.ru/src/3.10/Lib/concurrent/futures/thread.py) и [Lib/concurrent/futures/process.py](https://python-all.ru/src/3.10/Lib/concurrent/futures/process.py)1213---1415Модуль [`concurrent.futures`](https://python-all.ru/3.10/library/concurrent.futures.html#module-concurrent.futures) предоставляет высокоуровневый интерфейс для асинхронного выполнения вызываемых объектов.1617Асинхронное выполнение может выполняться с помощью потоков, используя [`ThreadPoolExecutor`](https://python-all.ru/3.10/library/concurrent.futures.html#concurrent.futures.ThreadPoolExecutor), или отдельных процессов, используя [`ProcessPoolExecutor`](https://python-all.ru/3.10/library/concurrent.futures.html#concurrent.futures.ProcessPoolExecutor). Оба реализуют один и тот же интерфейс, определяемый абстрактным классом [`Executor`](https://python-all.ru/3.10/library/concurrent.futures.html#concurrent.futures.Executor).1819## Объекты исполнителя2021#### `class concurrent.futures.Executor`2223Абстрактный класс, предоставляющий методы для асинхронного выполнения вызовов. Его не следует использовать напрямую, а через его конкретные подклассы.2425> #### `submit(fn, /, *args, **kwargs)`26>27> Планирует выполнение вызываемого объекта *fn* как `fn(*args, **kwargs)` и возвращает объект [`Future`](https://python-all.ru/3.10/library/concurrent.futures.html#concurrent.futures.Future), представляющий выполнение вызываемого объекта.28>29> ```python30> with ThreadPoolExecutor(max_workers=1) as executor:31> future = executor.submit(pow, 323, 1235)32> print(future.result())33> ```34>35> #### `map(func, *iterables, timeout=None, chunksize=1)`36>37> Аналогично [`map(func, *iterables)`](https://python-all.ru/3.10/library/functions.html#map), но:38>39> - *Итерируемые объекты* собираются немедленно, а не лениво;40> - *func* выполняется асинхронно, при этом несколько вызовов *func* могут производиться одновременно.41>42> Возвращаемый итератор возбуждает [`concurrent.futures.TimeoutError`](https://python-all.ru/3.10/library/concurrent.futures.html#concurrent.futures.TimeoutError), если вызван [`__next__()`](https://python-all.ru/3.10/library/stdtypes.html#iterator.__next__) и результат недоступен через *timeout* секунд после исходного вызова [`Executor.map()`](https://python-all.ru/3.10/library/concurrent.futures.html#concurrent.futures.Executor.map). *timeout* может быть целым числом или числом с плавающей запятой. Если *timeout* не указан или равен `None`, время ожидания не ограничено.43>44> Если вызов *func* порождает исключение, то это исключение будет возбуждено при получении его значения из итератора.45>46> При использовании [`ProcessPoolExecutor`](https://python-all.ru/3.10/library/concurrent.futures.html#concurrent.futures.ProcessPoolExecutor) этот метод разбивает *итерируемые объекты* на несколько частей, которые передаёт в пул как отдельные задачи. (Примерный) размер этих частей можно задать, установив *chunksize* в положительное целое число. Для очень длинных итерируемых объектов использование большого значения *chunksize* может значительно повысить производительность по сравнению со значением по умолчанию, равным 1. С [`ThreadPoolExecutor`](https://python-all.ru/3.10/library/concurrent.futures.html#concurrent.futures.ThreadPoolExecutor) параметр *chunksize* не влияет на выполнение.47>48> Изменено в версии 3.5: Добавлен аргумент *chunksize*.49>50> #### `shutdown(wait=True, *, cancel_futures=False)`51>52> Сообщает исполнителю, что он должен освободить все используемые ресурсы, когда текущие ожидающие future завершат выполнение. Вызовы [`Executor.submit()`](https://python-all.ru/3.10/library/concurrent.futures.html#concurrent.futures.Executor.submit) и [`Executor.map()`](https://python-all.ru/3.10/library/concurrent.futures.html#concurrent.futures.Executor.map) после shutdown приведут к возбуждению [`RuntimeError`](https://python-all.ru/3.10/library/exceptions.html#RuntimeError).53>54> Если *wait* равен `True`, то этот метод не вернёт управление, пока все ожидающие future не завершат выполнение и ресурсы, связанные с исполнителем, не будут освобождены. Если *wait* равен `False`, то метод вернёт управление немедленно, а ресурсы, связанные с исполнителем, будут освобождены, когда все ожидающие future завершат выполнение. Независимо от значения *wait*, вся программа Python не завершится, пока все ожидающие future не завершат выполнение.55>56> Если *cancel\_futures* равен `True`, этот метод отменит все ожидающие future, которые исполнитель ещё не начал выполнять. Любые future, которые уже завершены или выполняются, отменены не будут, независимо от значения *cancel\_futures*.57>58> Если и *cancel\_futures*, и *wait* равны `True`, то все future, которые исполнитель начал выполнять, будут завершены до возврата из этого метода. Остальные future отменяются.59>60> Вы можете избежать явного вызова этого метода, если используете оператор [`with`](https://python-all.ru/3.10/reference/compound_stmts.html#with), который завершит работу [`Executor`](https://python-all.ru/3.10/library/concurrent.futures.html#concurrent.futures.Executor) (ожидая, как если бы [`Executor.shutdown()`](https://python-all.ru/3.10/library/concurrent.futures.html#concurrent.futures.Executor.shutdown) был вызван с *wait*, установленным в `True`):61>62> ```python63> import shutil64> with ThreadPoolExecutor(max_workers=4) as e:65> e.submit(shutil.copy, 'src1.txt', 'dest1.txt')66> e.submit(shutil.copy, 'src2.txt', 'dest2.txt')67> e.submit(shutil.copy, 'src3.txt', 'dest3.txt')68> e.submit(shutil.copy, 'src4.txt', 'dest4.txt')69> ```70>71> Изменено в версии 3.9: Добавлен *cancel\_futures*.7273## ThreadPoolExecutor7475[`ThreadPoolExecutor`](https://python-all.ru/3.10/library/concurrent.futures.html#concurrent.futures.ThreadPoolExecutor) – подкласс [`Executor`](https://python-all.ru/3.10/library/concurrent.futures.html#concurrent.futures.Executor), использующий пул потоков для асинхронного выполнения вызовов.7677Взаимоблокировки могут возникать, когда вызываемый объект, связанный с [`Future`](https://python-all.ru/3.10/library/concurrent.futures.html#concurrent.futures.Future), ожидает результаты другого [`Future`](https://python-all.ru/3.10/library/concurrent.futures.html#concurrent.futures.Future). Например:7879```python80import time81def wait_on_b():82 time.sleep(5)83 print(b.result()) # b никогда не завершится, потому что он ожидает a.84 return 58586def wait_on_a():87 time.sleep(5)88 print(a.result()) # a никогда не завершится, потому что он ожидает b.89 return 69091executor = ThreadPoolExecutor(max_workers=2)92a = executor.submit(wait_on_b)93b = executor.submit(wait_on_a)94```9596И:9798```python99def wait_on_future():100 f = executor.submit(pow, 5, 2)101 # Это никогда не завершится, потому что есть только один рабочий поток и102 # он выполняет эту функцию.103 print(f.result())104105executor = ThreadPoolExecutor(max_workers=1)106executor.submit(wait_on_future)107```108109#### `class concurrent.futures.ThreadPoolExecutor(max_workers=None, thread_name_prefix='', initializer=None, initargs=())`110111Подкласс [`Executor`](https://python-all.ru/3.10/library/concurrent.futures.html#concurrent.futures.Executor), который использует пул не более чем из *max\_workers* потоков для асинхронного выполнения вызовов.112113Все потоки, поставленные в очередь `ThreadPoolExecutor`, будут присоединены до того, как интерпретатор сможет завершиться. Обратите внимание, что обработчик выхода, который это делает, выполняется *до* любых обработчиков выхода, добавленных с помощью `atexit`. Это означает, что исключения в главном потоке должны быть перехвачены и обработаны, чтобы потоки могли корректно завершиться. По этой причине рекомендуется не использовать `ThreadPoolExecutor` для долго выполняющихся задач.114115*initializer* – это необязательный вызываемый объект, который вызывается в начале каждого рабочего потока; *initargs* – это кортеж аргументов, передаваемых инициализатору. Если *initializer* вызовет исключение, все текущие ожидающие задачи вызовут [`BrokenThreadPool`](https://python-all.ru/3.10/library/concurrent.futures.html#concurrent.futures.thread.BrokenThreadPool), а также любая попытка отправить дополнительные задачи в пул.116117Изменено в версии 3.5: Если *max\_workers* равен `None` или не указан, он будет по умолчанию равен количеству процессоров на машине, умноженному на `5`, исходя из предположения, что [`ThreadPoolExecutor`](https://python-all.ru/3.10/library/concurrent.futures.html#concurrent.futures.ThreadPoolExecutor) часто используется для перекрытия операций ввода-вывода, а не для загрузки ЦП, и количество рабочих должно быть больше, чем количество рабочих для [`ProcessPoolExecutor`](https://python-all.ru/3.10/library/concurrent.futures.html#concurrent.futures.ProcessPoolExecutor).118119Новое в версии 3.6: Аргумент *thread\_name\_prefix* был добавлен, чтобы можно было управлять именами [`threading.Thread`](https://python-all.ru/3.10/library/threading.html#threading.Thread) рабочих потоков, создаваемых пулом, для упрощения отладки.120121Изменено в версии 3.7: Добавлены аргументы *initializer* и *initargs*.122123Изменено в версии 3.8: Значение по умолчанию *max\_workers* изменено на `min(32, os.cpu_count() + 4)`. Это значение по умолчанию сохраняет не менее 5 рабочих для задач, связанных с вводом-выводом. Оно использует не более 32 ядер ЦП для задач, связанных с ЦП и отпускающих GIL. И оно позволяет избежать неявного использования очень больших ресурсов на многоядерных машинах.124125ThreadPoolExecutor теперь также повторно использует простаивающие рабочие потоки, прежде чем запускать *max\_workers* рабочих потоков.126127### Пример ThreadPoolExecutor128129```python130import concurrent.futures131import urllib.request132133URLS = ['http://www.foxnews.com/',134 'http://www.cnn.com/',135 'http://europe.wsj.com/',136 'http://www.bbc.co.uk/',137 'http://nonexistant-subdomain.python.org/']138139# Получить одну страницу и вывести URL и содержимое140def load_url(url, timeout):141 with urllib.request.urlopen(url, timeout=timeout) as conn:142 return conn.read()143144# Можно использовать инструкцию with, чтобы гарантировать своевременную очистку потоков145with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor:146 # Запустить операции загрузки и пометить каждый future его URL147 future_to_url = {executor.submit(load_url, url, 60): url for url in URLS}148 for future in concurrent.futures.as_completed(future_to_url):149 url = future_to_url[future]150 try:151 data = future.result()152 except Exception as exc:153 print('%r generated an exception: %s' % (url, exc))154 else:155 print('%r page is %d bytes' % (url, len(data)))156```157158## ProcessPoolExecutor159160Класс [`ProcessPoolExecutor`](https://python-all.ru/3.10/library/concurrent.futures.html#concurrent.futures.ProcessPoolExecutor) является подклассом [`Executor`](https://python-all.ru/3.10/library/concurrent.futures.html#concurrent.futures.Executor), который использует пул процессов для асинхронного выполнения вызовов. [`ProcessPoolExecutor`](https://python-all.ru/3.10/library/concurrent.futures.html#concurrent.futures.ProcessPoolExecutor) использует модуль [`multiprocessing`](https://python-all.ru/3.10/library/multiprocessing.html#module-multiprocessing), что позволяет обойти [Глобальная блокировка интерпретатора](https://python-all.ru/3.10/glossary.html#term-global-interpreter-lock), но также означает, что только picklable-объекты могут быть выполнены и возвращены.161162Модуль `__main__` должен быть импортируемым рабочими подпроцессами. Это означает, что [`ProcessPoolExecutor`](https://python-all.ru/3.10/library/concurrent.futures.html#concurrent.futures.ProcessPoolExecutor) не будет работать в интерактивном интерпретаторе.163164Вызов методов [`Executor`](https://python-all.ru/3.10/library/concurrent.futures.html#concurrent.futures.Executor) или [`Future`](https://python-all.ru/3.10/library/concurrent.futures.html#concurrent.futures.Future) из вызываемого объекта, отправленного в [`ProcessPoolExecutor`](https://python-all.ru/3.10/library/concurrent.futures.html#concurrent.futures.ProcessPoolExecutor), приведёт к взаимоблокировке.165166#### `class concurrent.futures.ProcessPoolExecutor(max_workers=None, mp_context=None, initializer=None, initargs=())`167168Подкласс [`Executor`](https://python-all.ru/3.10/library/concurrent.futures.html#concurrent.futures.Executor), который асинхронно выполняет вызовы, используя пул из не более чем *max\_workers* процессов. Если *max\_workers* равен `None` или не указан, по умолчанию берётся количество процессоров на машине. Если *max\_workers* меньше или равно `0`, будет вызвано исключение [`ValueError`](https://python-all.ru/3.10/library/exceptions.html#ValueError). В Windows *max\_workers* должен быть не больше `61`. В противном случае возбуждается [`ValueError`](https://python-all.ru/3.10/library/exceptions.html#ValueError). Если *max\_workers* равен `None`, то выбранное по умолчанию значение будет не больше `61`, даже если доступно больше процессоров. *mp\_context* может быть контекстом multiprocessing или None. Он используется для запуска рабочих процессов. Если *mp\_context* равен `None` или не указан, используется контекст multiprocessing по умолчанию.169170*initializer* – необязательный вызываемый объект, который вызывается при запуске каждого рабочего процесса; *initargs* – кортеж аргументов, передаваемых инициализатору. Если *initializer* вызывает исключение, все текущие ожидающие задания вызовут [`BrokenProcessPool`](https://python-all.ru/3.10/library/concurrent.futures.html#concurrent.futures.process.BrokenProcessPool), как и любая попытка отправить новые задания в пул.171172Изменено в версии 3.3: Когда один из рабочих процессов завершается аварийно, теперь возбуждается ошибка `BrokenProcessPool`. Ранее поведение было неопределённым, но операции над исполнителем или его future часто приводили к зависанию или взаимоблокировке.173174Изменено в версии 3.7: Добавлен аргумент *mp\_context*, позволяющий пользователям управлять start\_method для рабочих процессов, создаваемых пулом.175176Добавлены аргументы *initializer* и *initargs*.177178### Пример ProcessPoolExecutor179180```python181import concurrent.futures182import math183184PRIMES = [185 112272535095293,186 112582705942171,187 112272535095293,188 115280095190773,189 115797848077099,190 1099726899285419]191192def is_prime(n):193 if n < 2:194 return False195 if n == 2:196 return True197 if n % 2 == 0:198 return False199200 sqrt_n = int(math.floor(math.sqrt(n)))201 for i in range(3, sqrt_n + 1, 2):202 if n % i == 0:203 return False204 return True205206def main():207 with concurrent.futures.ProcessPoolExecutor() as executor:208 for number, prime in zip(PRIMES, executor.map(is_prime, PRIMES)):209 print('%d is prime: %s' % (number, prime))210211if __name__ == '__main__':212 main()213```214215## Объекты Future216217Класс [`Future`](https://python-all.ru/3.10/library/concurrent.futures.html#concurrent.futures.Future) инкапсулирует асинхронное выполнение вызываемого объекта. Экземпляры [`Future`](https://python-all.ru/3.10/library/concurrent.futures.html#concurrent.futures.Future) создаются с помощью [`Executor.submit()`](https://python-all.ru/3.10/library/concurrent.futures.html#concurrent.futures.Executor.submit).218219#### `class concurrent.futures.Future`220221Инкапсулирует асинхронное выполнение вызываемого объекта. Экземпляры [`Future`](https://python-all.ru/3.10/library/concurrent.futures.html#concurrent.futures.Future) создаются с помощью [`Executor.submit()`](https://python-all.ru/3.10/library/concurrent.futures.html#concurrent.futures.Executor.submit) и не должны создаваться напрямую, за исключением тестирования.222223> #### `cancel()`224>225> Пытается отменить вызов. Если вызов в данный момент выполняется или уже завершён и не может быть отменён, метод вернёт `False`, в противном случае вызов будет отменён и метод вернёт `True`.226>227> #### `cancelled()`228>229> Возвращает `True`, если вызов был успешно отменён.230>231> #### `running()`232>233> Возвращает `True`, если вызов в данный момент выполняется и не может быть отменён.234>235> #### `done()`236>237> Возвращает `True`, если вызов был успешно отменён или завершён.238>239> #### `result(timeout=None)`240>241> Возвращает значение, возвращённое вызовом. Если вызов ещё не завершился, этот метод будет ждать до *timeout* секунд. Если вызов не завершится за *timeout* секунд, будет вызвано [`concurrent.futures.TimeoutError`](https://python-all.ru/3.10/library/concurrent.futures.html#concurrent.futures.TimeoutError). *timeout* может быть целым числом или числом с плавающей запятой. Если *timeout* не указан или равен `None`, время ожидания не ограничено.242>243> Если future отменён до завершения, будет вызвано [`CancelledError`](https://python-all.ru/3.10/library/concurrent.futures.html#concurrent.futures.CancelledError).244>245> Если вызов вызвал исключение, этот метод вызовет то же самое исключение.246>247> #### `exception(timeout=None)`248>249> Возвращает исключение, вызванное вызовом. Если вызов ещё не завершён, этот метод будет ожидать до *timeout* секунд. Если вызов не завершится за *timeout* секунд, будет вызвано [`concurrent.futures.TimeoutError`](https://python-all.ru/3.10/library/concurrent.futures.html#concurrent.futures.TimeoutError). *timeout* может быть целым числом или числом с плавающей запятой. Если *timeout* не указан или `None`, время ожидания не ограничено.250>251> Если future отменён до завершения, будет вызвано [`CancelledError`](https://python-all.ru/3.10/library/concurrent.futures.html#concurrent.futures.CancelledError).252>253> Если вызов завершился без исключения, возвращается `None`.254>255> #### `add_done_callback(fn)`256>257> Прикрепляет вызываемый объект *fn* к future. *fn* будет вызван с future в качестве единственного аргумента, когда future отменён или завершит выполнение.258>259> Добавленные вызываемые объекты вызываются в порядке их добавления и всегда вызываются в потоке, принадлежащем процессу, который их добавил. Если вызываемый объект вызывает подкласс [`Exception`](https://python-all.ru/3.10/library/exceptions.html#Exception), это будет зарегистрировано и проигнорировано. Если вызываемый объект вызывает подкласс [`BaseException`](https://python-all.ru/3.10/library/exceptions.html#BaseException), поведение не определено.260>261> Если future уже завершён или отменён, *fn* будет вызван немедленно.262263Следующие методы [`Future`](https://python-all.ru/3.10/library/concurrent.futures.html#concurrent.futures.Future) предназначены для использования в модульных тестах и реализациях [`Executor`](https://python-all.ru/3.10/library/concurrent.futures.html#concurrent.futures.Executor).264265> #### `set_running_or_notify_cancel()`266>267> Этот метод должен вызываться только реализациями [`Executor`](https://python-all.ru/3.10/library/concurrent.futures.html#concurrent.futures.Executor) перед выполнением работы, связанной с [`Future`](https://python-all.ru/3.10/library/concurrent.futures.html#concurrent.futures.Future), и модульными тестами.268>269> Если метод возвращает `False`, то [`Future`](https://python-all.ru/3.10/library/concurrent.futures.html#concurrent.futures.Future) был отменён, то есть [`Future.cancel()`](https://python-all.ru/3.10/library/concurrent.futures.html#concurrent.futures.Future.cancel) был вызван и вернул `True`. Все потоки, ожидающие завершения [`Future`](https://python-all.ru/3.10/library/concurrent.futures.html#concurrent.futures.Future) (например, через [`as_completed()`](https://python-all.ru/3.10/library/concurrent.futures.html#concurrent.futures.as_completed) или [`wait()`](https://python-all.ru/3.10/library/concurrent.futures.html#concurrent.futures.wait)), будут разбужены.270>271> Если метод возвращает `True`, то [`Future`](https://python-all.ru/3.10/library/concurrent.futures.html#concurrent.futures.Future) не был отменён и переведён в состояние выполнения, то есть вызовы [`Future.running()`](https://python-all.ru/3.10/library/concurrent.futures.html#concurrent.futures.Future.running) будут возвращать `True`.272>273> Этот метод можно вызвать только один раз, и его нельзя вызывать после вызова [`Future.set_result()`](https://python-all.ru/3.10/library/concurrent.futures.html#concurrent.futures.Future.set_result) или [`Future.set_exception()`](https://python-all.ru/3.10/library/concurrent.futures.html#concurrent.futures.Future.set_exception).274>275> #### `set_result(result)`276>277> Устанавливает результат работы, связанной с [`Future`](https://python-all.ru/3.10/library/concurrent.futures.html#concurrent.futures.Future), в *result*.278>279> Этот метод должен использоваться только реализациями [`Executor`](https://python-all.ru/3.10/library/concurrent.futures.html#concurrent.futures.Executor) и модульными тестами.280>281> Изменено в версии 3.8: Этот метод вызывает [`concurrent.futures.InvalidStateError`](https://python-all.ru/3.10/library/concurrent.futures.html#concurrent.futures.InvalidStateError), если [`Future`](https://python-all.ru/3.10/library/concurrent.futures.html#concurrent.futures.Future) уже завершён.282>283> #### `set_exception(exception)`284>285> Устанавливает результат работы, связанной с [`Future`](https://python-all.ru/3.10/library/concurrent.futures.html#concurrent.futures.Future), в [`Exception`](https://python-all.ru/3.10/library/exceptions.html#Exception) *исключение*.286>287> Этот метод должен использоваться только реализациями [`Executor`](https://python-all.ru/3.10/library/concurrent.futures.html#concurrent.futures.Executor) и модульными тестами.288>289> Изменено в версии 3.8: Этот метод вызывает [`concurrent.futures.InvalidStateError`](https://python-all.ru/3.10/library/concurrent.futures.html#concurrent.futures.InvalidStateError), если [`Future`](https://python-all.ru/3.10/library/concurrent.futures.html#concurrent.futures.Future) уже завершён.290291## Функции модуля292293#### `concurrent.futures.wait(fs, timeout=None, return_when=ALL_COMPLETED)`294295Ожидает завершения экземпляров [`Future`](https://python-all.ru/3.10/library/concurrent.futures.html#concurrent.futures.Future) (возможно, созданных разными экземплярами [`Executor`](https://python-all.ru/3.10/library/concurrent.futures.html#concurrent.futures.Executor)), заданных в *fs*. Дублирующиеся future, переданные в *fs*, удаляются и возвращаются только один раз. Возвращает именованный кортеж из двух множеств. Первое множество, названное `done`, содержит future, которые завершились (завершённые или отменённые future) до завершения ожидания. Второе множество, названное `not_done`, содержит future, которые не завершились (ожидающие или выполняющиеся future).296297*timeout* можно использовать для управления максимальным количеством секунд ожидания перед возвратом. *timeout* может быть целым числом или числом с плавающей запятой. Если *timeout* не указан или `None`, время ожидания не ограничено.298299*return\_when* указывает, когда эта функция должна вернуть результат. Он должен быть одной из следующих констант:300301| Константа | Описание |302| --- | --- |303| `FIRST_COMPLETED` | Функция вернёт управление, когда любой future завершится или будет отменён. |304| `FIRST_EXCEPTION` | Функция вернёт управление, когда любой future завершится возбуждением исключения. Если ни один future не возбудит исключение, то это эквивалентно `ALL_COMPLETED`. |305| `ALL_COMPLETED` | Функция вернёт управление, когда все future завершатся или будут отменены. |306307#### `concurrent.futures.as_completed(fs, timeout=None)`308309Возвращает итератор по экземплярам [`Future`](https://python-all.ru/3.10/library/concurrent.futures.html#concurrent.futures.Future) (возможно, созданным разными экземплярами [`Executor`](https://python-all.ru/3.10/library/concurrent.futures.html#concurrent.futures.Executor)), заданным в *fs*, который выдаёт future по мере их завершения (завершённые или отменённые future). Любые future, переданные в *fs*, которые дублируются, будут возвращены один раз. Все future, завершившиеся до вызова [`as_completed()`](https://python-all.ru/3.10/library/concurrent.futures.html#concurrent.futures.as_completed), будут выданы первыми. Возвращаемый итератор вызывает [`concurrent.futures.TimeoutError`](https://python-all.ru/3.10/library/concurrent.futures.html#concurrent.futures.TimeoutError), если [`__next__()`](https://python-all.ru/3.10/library/stdtypes.html#iterator.__next__) вызывается, а результат недоступен через *timeout* секунд после исходного вызова [`as_completed()`](https://python-all.ru/3.10/library/concurrent.futures.html#concurrent.futures.as_completed). *timeout* может быть целым числом или числом с плавающей запятой. Если *timeout* не указан или `None`, время ожидания не ограничено.310311> **См. также**312>313> **[**PEP 3148**](https://python-all.ru/3.10/library/concurrent.futures.html) – futures - execute computations asynchronously**314>315> Предложение, которое описывало эту возможность для включения в стандартную библиотеку Python.316317## Классы исключений318319#### `exception concurrent.futures.CancelledError`320321Возникает при отмене future.322323#### `exception concurrent.futures.TimeoutError`324325Возбуждается, когда операция с future превышает заданный тайм-аут.326327#### `exception concurrent.futures.BrokenExecutor`328329Производный от [`RuntimeError`](https://python-all.ru/3.10/library/exceptions.html#RuntimeError), этот класс исключения возникает, когда исполнитель по какой-то причине сломан и не может использоваться для отправки или выполнения новых задач.330331Добавлено в версии 3.7.332333#### `exception concurrent.futures.InvalidStateError`334335Возникает, когда над future выполняется операция, которая не разрешена в текущем состоянии.336337Новое в версии 3.8.338339#### `exception concurrent.futures.thread.BrokenThreadPool`340341Этот класс исключения, производный от [`BrokenExecutor`](https://python-all.ru/3.10/library/concurrent.futures.html#concurrent.futures.BrokenExecutor), возбуждается, когда один из рабочих процессов `ThreadPoolExecutor` не прошёл инициализацию.342343Добавлено в версии 3.7.344345#### `exception concurrent.futures.process.BrokenProcessPool`346347Производный от [`BrokenExecutor`](https://python-all.ru/3.10/library/concurrent.futures.html#concurrent.futures.BrokenExecutor) (ранее [`RuntimeError`](https://python-all.ru/3.10/library/exceptions.html#RuntimeError)), этот класс исключения возбуждается, когда один из рабочих процессов `ProcessPoolExecutor` завершился некорректно (например, если он был убит извне).348349Новое в версии 3.3.350