Python 3.2+concurrent.futuresпонятие
concurrent.futures.ThreadPoolExecutor
пул потоков
Пул потоков из модуля concurrent.futures. Управляет созданием и переиспользованием потоков. Удобен для параллельных I/O-задач.
Синтаксис
with ThreadPoolExecutor(max_workers=N) as ex:
future = ex.submit(fn, *args)
results = ex.map(fn, iterable)
Потоки в CPython делят один GIL, поэтому пул ускоряет только ожидание — сеть, диск, время; на чистых вычислениях выигрыша не будет, там нужен ProcessPoolExecutor. Выход из with вызывает shutdown(wait=True) и блокирует программу до конца всех задач, а исключение внутри задачи не всплывает само — оно ждёт в Future и выстрелит только при обращении к result(). Если max_workers не задан, число потоков считается от числа ядер и сверху ограничено 32.
Примеры
from concurrent.futures import ThreadPoolExecutor
import time
urls = ['https://python.org', 'https://pypi.org']
def fetch(url):
time.sleep(0.1) # имитация ожидания сети: пока один поток ждёт, работают другие
return len(url)
with ThreadPoolExecutor(max_workers=4) as ex:
print(list(ex.map(fetch, urls))) # → [18, 16] — порядок результатов как у входа
См. также
Открыть в полном глоссарииdocs.python.orgСообщить о неточности