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