Содержание страницы
concurrent.futures – Запуск параллельных задач¶concurrent.futures – Launching parallel tasks
Добавлено в версии 3.2.
Исходный код: Lib/concurrent/futures/thread.py, Lib/concurrent/futures/process.py, и Lib/concurrent/futures/interpreter.py
Модуль concurrent.futures предоставляет высокоуровневый интерфейс для
асинхронного выполнения вызываемых объектов.
Асинхронное выполнение может осуществляться с помощью потоков, используя
ThreadPoolExecutor или InterpreterPoolExecutor,
или отдельных процессов, используя ProcessPoolExecutor.
Каждый реализует один и тот же интерфейс, который определён
абстрактным классом Executor.
concurrent.futures.Future не следует путать с
asyncio.Future, который предназначен для использования с asyncio
задачами и корутинами. Обратитесь к документации asyncio.Future
для подробного сравнения двух.
Доступность: не WASI.
Этот модуль не работает или недоступен на WebAssembly. Подробнее см. платформы WebAssembly.
Объекты исполнителя¶Executor Objects
- class concurrent.futures.Executor¶
Абстрактный класс, предоставляющий методы для асинхронного выполнения вызовов. Его не следует использовать напрямую, а через его конкретные подклассы.
- submit(fn, /, *args, **kwargs)¶
Планирует выполнение вызываемого объекта fn как
fn(*args, **kwargs)и возвращает объектFuture, представляющий выполнение вызываемого объекта.with ThreadPoolExecutor(max_workers=1) as executor: future = executor.submit(pow, 323, 1235) print(future.result())
- map(fn, *iterables, timeout=None, chunksize=1, buffersize=None)¶
Аналогично
map(fn, *iterables), но:iterables собираются сразу, а не лениво, если только не указан buffersize, ограничивающий количество отправленных задач, результаты которых ещё не получены. Если буфер заполнен, итерация по iterables приостанавливается, пока результат не будет получен из буфера.
fn выполняется асинхронно, и несколько вызовов fn могут выполняться одновременно.
Возвращаемый итератор возбуждает
TimeoutError, если вызван__next__()и результат недоступен через timeout секунд после исходного вызоваExecutor.map(). timeout может быть целым числом или числом с плавающей запятой. Если timeout не указан или равенNone, время ожидания не ограничено.Если вызов fn возбуждает исключение, то это исключение будет возбуждено при получении его значения из итератора.
При использовании
ProcessPoolExecutorэтот метод разбивает iterables на несколько блоков, которые отправляет в пул как отдельные задачи. (Приблизительный) размер этих блоков можно задать, установив chunksize в положительное целое число. Для очень длинных итераций использование большого значения chunksize может значительно улучшить производительность по сравнению со значением по умолчанию, равным 1. ДляThreadPoolExecutorиInterpreterPoolExecutorchunksize не влияет.Изменено в версии 3.5: Добавлен параметр chunksize.
Изменено в версии 3.14: Добавлен параметр buffersize.
- shutdown(wait=True, *, cancel_futures=False)¶
Сообщает исполнителю, что он должен освободить все используемые ресурсы, когда текущие ожидающие future завершат выполнение. Вызовы
Executor.submit()иExecutor.map()после shutdown приведут к возбуждениюRuntimeError.Если wait равен
True, то этот метод не вернёт управление, пока все ожидающие future не завершат выполнение и ресурсы, связанные с исполнителем, не будут освобождены. Если wait равенFalse, то метод вернёт управление немедленно, а ресурсы, связанные с исполнителем, будут освобождены, когда все ожидающие future завершат выполнение. Независимо от значения wait, вся программа Python не завершится, пока все ожидающие future не завершат выполнение.Если cancel_futures равен
True, этот метод отменит все ожидающие future, которые исполнитель ещё не начал выполнять. Любые future, которые уже завершены или выполняются, отменены не будут, независимо от значения cancel_futures.Если и cancel_futures, и wait равны
True, то все future, которые исполнитель начал выполнять, будут завершены до возврата из этого метода. Остальные future отменяются.Можно избежать явного вызова этого метода, если использовать исполнитель как менеджер контекста через оператор
with, который завершит работуExecutor(ожидая, как если быExecutor.shutdown()был вызван с wait, установленным вTrue):import shutil with ThreadPoolExecutor(max_workers=4) as e: e.submit(shutil.copy, 'src1.txt', 'dest1.txt') e.submit(shutil.copy, 'src2.txt', 'dest2.txt') e.submit(shutil.copy, 'src3.txt', 'dest3.txt') e.submit(shutil.copy, 'src4.txt', 'dest4.txt')
Изменено в версии 3.9: Добавлен cancel_futures.
ThreadPoolExecutor¶
ThreadPoolExecutor – подкласс Executor, использующий пул
потоков для асинхронного выполнения вызовов.
Взаимоблокировки могут возникать, когда вызываемый объект, связанный с Future, ожидает
результаты другого Future. Например:
import time
def wait_on_b():
time.sleep(5)
print(b.result()) # b никогда не завершится, потому что он ожидает a.
return 5
def wait_on_a():
time.sleep(5)
print(a.result()) # a никогда не завершится, потому что он ожидает b.
return 6
executor = ThreadPoolExecutor(max_workers=2)
a = executor.submit(wait_on_b)
b = executor.submit(wait_on_a)
И:
def wait_on_future():
f = executor.submit(pow, 5, 2)
# Это никогда не завершится, потому что есть только один рабочий поток и
# он выполняет эту функцию.
print(f.result())
executor = ThreadPoolExecutor(max_workers=1)
future = executor.submit(wait_on_future)
# Примечание: вызов future.result() также приведёт к взаимоблокировке, потому что
# единственный рабочий поток уже ожидает wait_on_future().
- class concurrent.futures.ThreadPoolExecutor(max_workers=None, thread_name_prefix='', initializer=None, initargs=())¶
Подкласс
Executor, который использует пул не более чем из max_workers потоков для асинхронного выполнения вызовов.Все потоки, поставленные в очередь
ThreadPoolExecutor, будут присоединены до того, как интерпретатор сможет завершиться. Обратите внимание, что обработчик выхода, который это делает, выполняется до любых обработчиков выхода, добавленных с помощьюatexit. Это означает, что исключения в главном потоке должны быть перехвачены и обработаны, чтобы потоки могли корректно завершиться. По этой причине рекомендуется не использоватьThreadPoolExecutorдля долго выполняющихся задач.initializer – это необязательный вызываемый объект, который вызывается в начале каждого рабочего потока; initargs – это кортеж аргументов, передаваемых инициализатору. Если initializer вызовет исключение, все текущие ожидающие задачи вызовут
BrokenThreadPool, а также любая попытка отправить дополнительные задачи в пул.Изменено в версии 3.5: Если max_workers равен
Noneили не указан, он будет по умолчанию равен количеству процессоров на машине, умноженному на5, исходя из предположения, чтоThreadPoolExecutorчасто используется для перекрытия операций ввода-вывода, а не для загрузки ЦП, и количество рабочих должно быть больше, чем количество рабочих дляProcessPoolExecutor.Изменено в версии 3.6: Добавлен параметр thread_name_prefix, позволяющий пользователям управлять
threading.Threadименами рабочих потоков, создаваемых пулом, для упрощения отладки.Изменено в версии 3.7: Добавлены аргументы initializer и initargs.
Изменено в версии 3.8: Значение по умолчанию max_workers изменено на
min(32, os.cpu_count() + 4). Это значение по умолчанию сохраняет не менее 5 рабочих для задач, связанных с вводом-выводом. Оно использует не более 32 ядер ЦП для задач, связанных с ЦП и отпускающих GIL. И оно позволяет избежать неявного использования очень больших ресурсов на многоядерных машинах.ThreadPoolExecutor теперь также повторно использует простаивающие рабочие потоки, прежде чем запускать max_workers рабочих потоков.
Изменено в версии 3.13: Значение по умолчанию max_workers изменено на
min(32, (os.process_cpu_count() or 1) + 4).
Пример ThreadPoolExecutor¶ThreadPoolExecutor Example
import concurrent.futures
import urllib.request
URLS = ['http://www.foxnews.com/',
'http://www.cnn.com/',
'http://europe.wsj.com/',
'http://www.bbc.co.uk/',
'http://nonexistent-subdomain.python.org/']
# Получить одну страницу и вывести URL и содержимое
def load_url(url, timeout):
with urllib.request.urlopen(url, timeout=timeout) as conn:
return conn.read()
# Можно использовать инструкцию with, чтобы гарантировать своевременную очистку потоков
with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor:
# Запустить операции загрузки и пометить каждый future его URL
future_to_url = {executor.submit(load_url, url, 60): url for url in URLS}
for future in concurrent.futures.as_completed(future_to_url):
url = future_to_url[future]
try:
data = future.result()
except Exception as exc:
print('%r generated an exception: %s' % (url, exc))
else:
print('%r page is %d bytes' % (url, len(data)))
InterpreterPoolExecutor¶
Добавлено в версии 3.14.
Класс InterpreterPoolExecutor использует пул интерпретаторов
для асинхронного выполнения вызовов. Он является подклассом ThreadPoolExecutor,
что означает, что каждый рабочий выполняется в своём собственном потоке.
Отличие здесь в том, что каждый рабочий имеет свой собственный интерпретатор
и выполняет каждую задачу с использованием этого интерпретатора.
Самое большое преимущество использования интерпретаторов вместо только потоков – это настоящий многоядерный параллелизм. Каждый интерпретатор имеет свой собственный Глобальная блокировка интерпретатора, поэтому код, выполняемый в одном интерпретаторе, может работать на одном ядре ЦП, в то время как код в другом интерпретаторе выполняется без блокировок на другом ядре.
Обратная сторона в том, что написание параллельного кода для использования с несколькими интерпретаторами может потребовать дополнительных усилий. Однако это связано с тем, что он заставляет обдуманно подходить к тому, как и когда интерпретаторы взаимодействуют, и явно указывать, какие данные передаются между интерпретаторами. Это даёт несколько преимуществ, которые помогают компенсировать дополнительные усилия, включая настоящий многоядерный параллелизм. Например, код, написанный таким образом, может упростить понимание параллелизма. Ещё одно важное преимущество – вам не нужно иметь дело с рядом серьёзных проблем использования потоков, таких как состояния гонки.
Интерпретатор каждого рабочего изолирован от всех остальных интерпретаторов.
«Изолирован» означает, что каждый интерпретатор имеет собственное состояние выполнения и
работает полностью независимо. Например, если перенаправить
sys.stdout в одном интерпретаторе, это не приведёт к автоматическому
перенаправлению в любом другом интерпретаторе. Если импортировать модуль в одном
интерпретаторе, он не будет автоматически импортирован в другом. Вам
придётся импортировать модуль отдельно в том интерпретаторе, где
он нужен. Фактически каждый модуль, импортированный в одном интерпретаторе, является
полностью отдельным объектом по сравнению с тем же модулем в другом
интерпретаторе, включая sys, builtins,
и даже __main__.
Изоляция означает, что изменяемый объект или другие данные не могут использоваться более чем одним интерпретатором одновременно. Это фактически означает, что интерпретаторы не могут совместно использовать такие объекты или данные. Вместо этого каждый интерпретатор должен иметь свою собственную копию, и вам придётся вручную синхронизировать любые изменения между копиями. Неизменяемые объекты и данные, такие как встроенные синглтоны, строки и кортежи неизменяемых объектов, не имеют этих ограничений.
Передача данных и синхронизация между интерпретаторами наиболее эффективно
выполняются с помощью специализированных инструментов, таких как предложенные в PEP 734. Один менее
эффективный альтернативный подход – сериализация с помощью pickle и затем отправка
байтов через общий socket или
pipe.
- class concurrent.futures.InterpreterPoolExecutor(max_workers=None, thread_name_prefix='', initializer=None, initargs=())¶
Подкласс
ThreadPoolExecutor, который выполняет вызовы асинхронно, используя пул не более чем из max_workers потоков. Каждый поток выполняет задачи в своём собственном интерпретаторе. Рабочие интерпретаторы изолированы друг от друга, то есть каждый имеет собственное состояние выполнения и они не могут совместно использовать изменяемые объекты или другие данные. Каждый интерпретатор имеет свой собственный Глобальная блокировка интерпретатора, что означает, что код, выполняемый с этим исполнителем, обладает настоящим многоядерным параллелизмом.Необязательные аргументы initializer и initargs имеют тот же смысл, что и для
ThreadPoolExecutor: инициализатор запускается при создании каждого рабочего, хотя в данном случае он запускается в интерпретаторе рабочего. Исполнитель сериализует initializer и initargs с помощьюpickleпри их отправке в интерпретатор рабочего.Примечание
Исполнитель может заменять неперехваченные исключения из initializer на
ExecutionFailed.Другие предостережения от родительского
ThreadPoolExecutorприменимы и здесь.
submit() и map() работают как обычно,
за исключением того, что рабочий сериализует вызываемый объект и аргументы с помощью
pickle при отправке их в свой интерпретатор. Рабочий
также сериализует возвращаемое значение при отправке его обратно.
Когда текущая задача рабочего вызывает неперехваченное исключение, рабочий
всегда пытается сохранить исключение как есть. Если это удаётся,
то он также устанавливает __cause__ в соответствующий
экземпляр ExecutionFailed,
который содержит сводку исходного исключения.
В редком случае, когда рабочий не может сохранить
исходное исключение как есть, он вместо этого напрямую сохраняет соответствующий
экземпляр ExecutionFailed.
ProcessPoolExecutor¶
Класс ProcessPoolExecutor является подклассом Executor, который использует пул процессов для асинхронного выполнения вызовов. ProcessPoolExecutor использует модуль multiprocessing, что позволяет обойти Глобальная блокировка интерпретатора, но также означает, что только picklable-объекты могут быть выполнены и возвращены.
Модуль __main__ должен быть импортируемым рабочими подпроцессами. Это означает,
что ProcessPoolExecutor не будет работать в интерактивном интерпретаторе.
Вызов методов Executor или Future из вызываемого объекта, отправленного
в ProcessPoolExecutor, приведёт к взаимоблокировке.
Обратите внимание, что ограничения на функции и аргументы, требующие возможности сериализации через pickle, в соответствии с multiprocessing.Process применяются при использовании submit() и map() на ProcessPoolExecutor. Не следует ожидать, что функция, определённая в интерактивном интерпретаторе (REPL), или лямбда-функция будут работать.
- class concurrent.futures.ProcessPoolExecutor(max_workers=None, mp_context=None, initializer=None, initargs=(), max_tasks_per_child=None)¶
Подкласс
Executor, который выполняет вызовы асинхронно, используя пул из не более чем max_workers процессов. Если max_workers равенNoneили не указан, по умолчанию будет использоватьсяos.process_cpu_count(). Если max_workers меньше или равен0, то будет вызвано исключениеValueError. В Windows max_workers должен быть меньше или равен61. Если это не так, то будет вызваноValueError. Если max_workers равенNone, то выбранное по умолчанию значение будет не больше61, даже если доступно больше процессоров. mp_context может быть контекстомmultiprocessingилиNone. Он будет использоваться для запуска рабочих процессов. Если mp_context равенNoneили не указан, используется контекст по умолчаниюmultiprocessing. См. Контексты и методы запуска.initializer – необязательный вызываемый объект, который вызывается при запуске каждого рабочего процесса; initargs – кортеж аргументов, передаваемых инициализатору. Если initializer вызывает исключение, все текущие ожидающие задания вызовут
BrokenProcessPool, как и любая попытка отправить новые задания в пул.max_tasks_per_child – необязательный аргумент, задающий максимальное количество задач, которое может выполнить один процесс, прежде чем он завершится и будет заменён новым рабочим процессом. По умолчанию max_tasks_per_child равен
None, что означает, что рабочие процессы будут жить столько же, сколько и пул. Если задан максимум, по умолчанию будет использоваться метод запуска "spawn" multiprocessing при отсутствии параметра mp_context. Эта возможность несовместима с методом запуска "fork".Изменено в версии 3.3: Теперь, когда один из рабочих процессов внезапно завершается, возникает ошибка
BrokenProcessPool. Ранее поведение было неопределённым, но операции с исполнителем или его future часто зависали или приводили к взаимоблокировке.Изменено в версии 3.7: Добавлен аргумент mp_context, позволяющий пользователям управлять start_method для рабочих процессов, создаваемых пулом.
Добавлены аргументы initializer и initargs.
Изменено в версии 3.11: Добавлен аргумент max_tasks_per_child, позволяющий пользователям контролировать время жизни рабочих процессов в пуле.
Изменено в версии 3.12: В системах POSIX, если приложение имеет несколько потоков и контекст
multiprocessingиспользует метод запуска"fork": функцияos.fork(), вызываемая внутри для порождения рабочих процессов, может вызватьDeprecationWarning. Передайте mp_context, настроенный на использование другого метода запуска. См. документациюos.fork()для дальнейших пояснений.Изменено в версии 3.13: max_workers по умолчанию использует
os.process_cpu_count()вместоos.cpu_count().Изменено в версии 3.14: Метод запуска процесса по умолчанию (см. Контексты и методы запуска) больше не использует fork. Если требуется метод запуска fork для
ProcessPoolExecutor, необходимо явно передатьmp_context=multiprocessing.get_context("fork").Changed in version 3.15.0b3 (unreleased): Fixed a deadlock (gh-115634) where the executor could hang after a worker process exited upon reaching its max_tasks_per_child limit while tasks remained queued.
- terminate_workers()¶
Пытается немедленно завершить все живые рабочие процессы, вызывая
Process.terminateдля каждого из них. Внутри также вызываетExecutor.shutdown(), чтобы гарантировать освобождение всех остальных ресурсов, связанных с исполнителем.После вызова этого метода вызывающая сторона не должна больше отправлять задачи исполнителю.
Добавлено в версии 3.14.
- kill_workers()¶
Пытается немедленно уничтожить все живые рабочие процессы, вызывая
Process.killдля каждого из них. Внутри также вызываетExecutor.shutdown(), чтобы гарантировать освобождение всех остальных ресурсов, связанных с исполнителем.После вызова этого метода вызывающая сторона не должна больше отправлять задачи исполнителю.
Добавлено в версии 3.14.
Пример ProcessPoolExecutor¶ProcessPoolExecutor Example
import concurrent.futures
import math
PRIMES = [
112272535095293,
112582705942171,
112272535095293,
115280095190773,
115797848077099,
1099726899285419]
def is_prime(n):
if n < 2:
return False
if n == 2:
return True
if n % 2 == 0:
return False
sqrt_n = int(math.floor(math.sqrt(n)))
for i in range(3, sqrt_n + 1, 2):
if n % i == 0:
return False
return True
def main():
with concurrent.futures.ProcessPoolExecutor() as executor:
for number, prime in zip(PRIMES, executor.map(is_prime, PRIMES)):
print('%d is prime: %s' % (number, prime))
if __name__ == '__main__':
main()
Объекты Future¶Future Objects
Класс Future инкапсулирует асинхронное выполнение вызываемого объекта. Экземпляры Future создаются с помощью Executor.submit().
- class concurrent.futures.Future¶
Инкапсулирует асинхронное выполнение вызываемого объекта. Экземпляры
Futureсоздаются с помощьюExecutor.submit()и не должны создаваться напрямую, за исключением тестирования.- cancel()¶
Пытается отменить вызов. Если вызов в данный момент выполняется или уже завершён и не может быть отменён, метод вернёт
False, в противном случае вызов будет отменён и метод вернётTrue.
- cancelled()¶
Возвращает
True, если вызов был успешно отменён.
- running()¶
Возвращает
True, если вызов в данный момент выполняется и не может быть отменён.
- done()¶
Возвращает
True, если вызов был успешно отменён или завершён.
- result(timeout=None)¶
Возвращает значение, возвращённое вызовом. Если вызов ещё не завершился, этот метод будет ждать до timeout секунд. Если вызов не завершится за timeout секунд, будет вызвано
TimeoutError. timeout может быть целым числом или числом с плавающей запятой. Если timeout не указан или равенNone, время ожидания не ограничено.Если future отменён до завершения, будет вызвано
CancelledError.Если вызов вызвал исключение, этот метод вызовет то же самое исключение.
- exception(timeout=None)¶
Возвращает исключение, вызванное вызовом. Если вызов ещё не завершён, этот метод будет ожидать до timeout секунд. Если вызов не завершится за timeout секунд, будет вызвано
TimeoutError. timeout может быть целым числом или числом с плавающей запятой. Если timeout не указан илиNone, время ожидания не ограничено.Если future отменён до завершения, будет вызвано
CancelledError.Если вызов завершился без исключения, возвращается
None.
- add_done_callback(fn)¶
Прикрепляет вызываемый объект fn к future. fn будет вызван с future в качестве единственного аргумента, когда future отменён или завершит выполнение.
Добавленные вызываемые объекты вызываются в порядке их добавления и всегда вызываются в потоке, принадлежащем процессу, который их добавил. Если вызываемый объект вызывает подкласс
Exception, это будет зарегистрировано и проигнорировано. Если вызываемый объект вызывает подклассBaseException, поведение не определено.Если future уже завершён или отменён, fn будет вызван немедленно.
Следующие методы
Futureпредназначены для использования в модульных тестах и реализацияхExecutor.- set_running_or_notify_cancel()¶
Этот метод должен вызываться только реализациями
Executorперед выполнением работы, связанной сFuture, и модульными тестами.Если метод возвращает
False, тоFutureбыл отменён, то естьFuture.cancel()был вызван и вернулTrue. Все потоки, ожидающие завершенияFuture(например, черезas_completed()илиwait()), будут разбужены.Если метод возвращает
True, тоFutureне был отменён и переведён в состояние выполнения, то есть вызовыFuture.running()будут возвращатьTrue.Этот метод можно вызвать только один раз, и его нельзя вызывать после вызова
Future.set_result()илиFuture.set_exception().
- set_result(result)¶
Устанавливает результат работы, связанной с
Future, в result.Этот метод должен использоваться только реализациями
Executorи модульными тестами.Изменено в версии 3.8: Этот метод вызывает
concurrent.futures.InvalidStateError, еслиFutureуже завершён.
- set_exception(exception)¶
Устанавливает результат работы, связанной с
Future, вExceptionисключение.Этот метод должен использоваться только реализациями
Executorи модульными тестами.Изменено в версии 3.8: Этот метод вызывает
concurrent.futures.InvalidStateError, еслиFutureуже завершён.
Функции модуля¶Module Functions
- concurrent.futures.wait(fs, timeout=None, return_when=ALL_COMPLETED)¶
Ожидает завершения экземпляров
Future(возможно, созданных разными экземплярамиExecutor), заданных в fs. Дублирующиеся future, переданные в fs, удаляются и возвращаются только один раз. Возвращает именованный кортеж из двух множеств. Первое множество, названноеdone, содержит future, которые завершились (завершённые или отменённые future) до завершения ожидания. Второе множество, названноеnot_done, содержит future, которые не завершились (ожидающие или выполняющиеся future).timeout можно использовать для управления максимальным количеством секунд ожидания перед возвратом. timeout может быть целым числом или числом с плавающей запятой. Если timeout не указан или
None, время ожидания не ограничено.return_when указывает, когда эта функция должна вернуть результат. Он должен быть одной из следующих констант:
Константа
Описание
- concurrent.futures.FIRST_COMPLETED¶
Функция возвращает результат, когда любой future завершается или отменяется.
- concurrent.futures.FIRST_EXCEPTION¶
Функция вернёт результат, когда любой future завершится, возбудив исключение. Если ни один future не возбудит исключение, то это эквивалентно
ALL_COMPLETED.- concurrent.futures.ALL_COMPLETED¶
Функция вернёт результат, когда все futures завершатся или будут отменены.
- concurrent.futures.as_completed(fs, timeout=None)¶
Возвращает итератор по экземплярам
Future(возможно, созданным разными экземплярамиExecutor), заданным в fs, который выдаёт future по мере их завершения (завершённые или отменённые future). Любые future, переданные в fs, которые дублируются, будут возвращены один раз. Все future, завершившиеся до вызоваas_completed(), будут выданы первыми. Возвращаемый итератор вызываетTimeoutError, если__next__()вызывается, а результат недоступен через timeout секунд после исходного вызоваas_completed(). timeout может быть целым числом или числом с плавающей запятой. Если timeout не указан илиNone, время ожидания не ограничено.
См. также
- PEP 3148 – futures - execute computations asynchronously
Предложение, которое описывало эту возможность для включения в стандартную библиотеку Python.
Классы исключений¶Exception classes
- exception concurrent.futures.CancelledError¶
Возникает при отмене future.
- exception concurrent.futures.TimeoutError¶
Устаревший псевдоним
TimeoutError, возникает, когда операция с future превышает заданный таймаут.Изменено в версии 3.11: Этот класс стал псевдонимом для
TimeoutError.
- exception concurrent.futures.BrokenExecutor¶
Производный от
RuntimeError, этот класс исключения возникает, когда исполнитель по какой-то причине сломан и не может использоваться для отправки или выполнения новых задач.Добавлено в версии 3.7.
- exception concurrent.futures.InvalidStateError¶
Возникает, когда над future выполняется операция, которая не разрешена в текущем состоянии.
Добавлено в версии 3.8.
- exception concurrent.futures.thread.BrokenThreadPool¶
Производный от
BrokenExecutor, этот класс исключения возникает, когда один из рабочих потоковThreadPoolExecutorне смог инициализироваться.Добавлено в версии 3.7.
- exception concurrent.futures.interpreter.BrokenInterpreterPool¶
Производный от
BrokenThreadPool, этот класс исключения возникает, когда один из рабочих процессовInterpreterPoolExecutorне смог инициализироваться.Добавлено в версии 3.14.
- exception concurrent.futures.process.BrokenProcessPool¶
Производный от
BrokenExecutor(ранееRuntimeError), этот класс исключения возникает, когда один из рабочих процессовProcessPoolExecutorзавершился нечисто (например, если он был убит извне).Добавлено в версии 3.3.