1 回答

TA貢獻1797條經驗 獲得超6個贊
隨著你每次都開始一個新的經理流程,所以你真的在嵌套經理(就像標題所說的那樣),這不是它應該的方式Manager()。Manager().dict()相反,您需要做的是實例化一個Manager,然后在該 manager 實例上創建字典:
from multiprocessing import Process, Manager
from multiprocessing.managers import DictProxy
def task(test): # use parameter `test`, else you rely on forking
test['z'] += 1
test['y']['Y0'] += 5
if __name__ == '__main__':
with Manager() as m:
test = m.dict({'x': m.dict({'X0': 10, 'X1': 20}),
'y': m.dict({'Y0': 0, 'Y1': 0}),
'z': 0})
p = Process(target=task, args=(test,))
p.start()
p.join()
print(test)
print(test['y'])
# convert to normal dict before closing manager for persistence
# in parent or for printing dict behind proxies
d = {k: dict(v) if isinstance(v, DictProxy) else v
for k, v in test.items()}
print(d) # Manager already closed here
示例輸出:
{'x': <DictProxy object, typeid 'dict' at 0x7f98cdaaa588>, 'y': <DictProxy object, typeid 'dict' at 0x7f98cda99c50>, 'z': 1}
{'Y0': 5, 'Y1': 0}
{'x': {'X0': 10, 'X1': 20}, 'y': {'Y0': 5, 'Y1': 0}, 'z': 1}
Process finished with exit code 0
Manager.Lock如果您計劃從多個進程修改管理器對象,您還需要使用它。
添加回答
舉報