Python Glossary English

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