все Python 3multiprocessingпонятие
multiprocessing.Pool
пул и менеджер
Пул рабочих процессов: map(), imap(), starmap() и apply_async() раздают задачи и собирают результаты. Классический способ распараллелить функцию по данным.
Синтаксис
with ctx.Pool(processes=None) as pool: pool.map(func, iterable, chunksize=None)
Выход из with вызывает terminate(), а не close() и join(): незабранные результаты apply_async пропадают — получайте их внутри with. Функция и аргументы идут через pickle, так что lambda не подойдёт; исключение из работника перевыбрасывается в родителе при .get(). Для нового кода чаще удобнее concurrent.futures.ProcessPoolExecutor: объекты Future, связь с asyncio и BrokenProcessPool, если работник умер (Pool в этом случае может зависнуть). Pool сильнее там, где нужны imap_unordered, maxtasksperchild или chunksize.
Примеры
import multiprocessing as mp
def square(x):
return x * x
if __name__ == '__main__':
with mp.get_context('spawn').Pool(2) as pool:
print(pool.map(square, range(5))) # → [0, 1, 4, 9, 16]
print(pool.starmap(pow, [(2, 3), (3, 2)])) # → [8, 9]
import multiprocessing as mp
if __name__ == '__main__':
with mp.get_context('spawn').Pool(2) as pool:
r = pool.apply_async(divmod, (1, 0)) # падает в работнике
try:
r.get(timeout=10)
except ZeroDivisionError as e:
print('raised in parent:', type(e).__name__) # → raised in parent: ZeroDivisionError
import multiprocessing as mp
import time
def slow():
time.sleep(2)
return 'done'
if __name__ == '__main__':
with mp.get_context('spawn').Pool(2) as pool:
r = pool.apply_async(slow)
print(r.ready()) # → False — выход из with сделал terminate()
См. также
Открыть в полном глоссарииdocs.python.orgСообщить о неточности