Python Glossary English

Python 3.2+concurrent.futuresпонятие

concurrent.futures.ProcessPoolExecutor

пул процессов

Пул процессов из concurrent.futures. Обходит GIL — каждый процесс имеет свой интерпретатор. Используй для CPU-интенсивных задач.

Синтаксис

with ProcessPoolExecutor(max_workers=N) as ex:
    future = ex.submit(fn, *args)
    results = ex.map(fn, iterable)

Аргументы и возвращаемые значения ездят между процессами через pickle, поэтому лямбды, вложенные функции и незапикливаемые объекты сюда не передать — функция должна быть определена на верхнем уровне модуля. На Windows и macOS процессы стартуют через spawn, а на Linux с 3.14 по умолчанию через forkserver, то есть дочерний процесс заново импортирует ваш модуль: без охраны if __name__ == '__main__' пул ломается — дочерние процессы падают с RuntimeError, а родитель получает BrokenProcessPool. И запуск процесса плюс сериализация данных стоят дорого, так что на мелких или I/O-задачах ThreadPoolExecutor окажется быстрее.

Примеры

from concurrent.futures import ProcessPoolExecutor
def heavy(n):
    return sum(range(n))
if __name__ == '__main__':
    with ProcessPoolExecutor() as ex:
        results = list(ex.map(heavy, [10**6] * 4))
        print(results)

См. также

Открыть в полном глоссарииdocs.python.orgСообщить о неточности