multiprocessing.Manager共享内存的问题记录
Posted 青山应回首
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了multiprocessing.Manager共享内存的问题记录相关的知识,希望对你有一定的参考价值。
问题:https://stackoverflow.com/questions/8640367/python-manager-dict-in-multiprocessing
使用 multiprocessing.Manager 来实现IPC的时候,遇到的问题
示例1
>>> from multiprocessing import Process, Manager >>> >>> manager = Manager() >>> d = manager.dict() >>> >>> def f(): ... d[\'k\'].append(3) ... print d ... >>> if __name__ == \'__main__\': ... d[\'k\'] = [] ... p = Process(target=f) ... p.start() ... p.join() ... {\'k\': []} >>>
示例2
>>> from multiprocessing import Process, Manager >>> >>> def f(d): ... d[\'k\'].append(4) ... print type(d),d,id(d) ... >>> if __name__ == \'__main__\': ... manager = Manager() ... d = manager.dict({\'k\':[]}) ... p = Process(target=f,args=(d,)) ... p.start() ... p.join() ... print type(d),d,id(d) ... <class \'multiprocessing.managers.DictProxy\'> {\'k\': []} 140607041173456 <class \'multiprocessing.managers.DictProxy\'> {\'k\': []} 140607041173456 >>>
为什么没有append成功呢?
再看示例3
>>> from multiprocessing import Process, Manager >>> >>> manager = Manager() >>> d = manager.dict() >>> >>> def f(): ... d[\'k\'] = 2 ... print d ... >>> if __name__ == \'__main__\': ... d[\'k\'] = [] ... p = Process(target=f) ... p.start() ... p.join() ... {\'k\': 2} >>>
参考:http://www.cnblogs.com/havePassed/p/5168833.html
总结
使用Manager方法时需要注意,在操作共享对象时候,除了赋值操作,其他的方法都作用在共享对象的拷贝上,并不会对共享对象生效。
以上是关于multiprocessing.Manager共享内存的问题记录的主要内容,如果未能解决你的问题,请参考以下文章
Python多进程(multiprocessing)共享变量
如何使用 multiprocessing.Manager()?
Ubuntu、cx_Freeze 和 multiprocessing.Manager() 在“spawn”类型进程的情况下发生冲突