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Сообщить о неточности