Python Glossary English

все Python 3multiprocessingфункция

multiprocessing.Manager()

пул и менеджер

Запускает процесс-сервер (SyncManager) и возвращает менеджер, который создаёт общие dict, list, Queue, Lock и другие объекты, доступные через прокси.

Синтаксис

with ctx.Manager() as manager: d = manager.dict(); lst = manager.list()

Каждое обращение к прокси — обмен сообщениями с сервером, поэтому это в сотни раз медленнее Value/Array, зато годится для произвольных объектов. Ловушка вложенности: d['k'].append(1) меняет копию, полученную из сервера, и изменение теряется — достаньте, измените и присвойте обратно. Объекты менеджера, в отличие от Lock и Queue, можно передавать и через Pool. Используйте with: при выходе сервер останавливается, и прокси после этого не работают.

Примеры

import multiprocessing as mp
def record(d, key):
    d[key] = key * 2
if __name__ == '__main__':
    ctx = mp.get_context('spawn')
    with ctx.Manager() as manager:
        d = manager.dict()
        ps = [ctx.Process(target=record, args=(d, k)) for k in (1, 2)]
        for p in ps:
            p.start()
        for p in ps:
            p.join()
        print(sorted(d.items()))  # → [(1, 2), (2, 4)]
import multiprocessing as mp
if __name__ == '__main__':
    with mp.get_context('spawn').Manager() as manager:
        d = manager.dict({'k': []})
        d['k'].append(1)  # меняется копия, а не общий список
        print(d['k'])  # → []
        items = d['k']
        items.append(1)
        d['k'] = items  # присваивание отправляет новое значение серверу
        print(d['k'])  # → [1]

См. также

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