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中同步两个共享对象的读/写操作

Python多进程(multiprocessing)共享变量

如何使用 multiprocessing.Manager()?

如何在 python 的多处理中创建嵌套共享对象?

Ubuntu、cx_Freeze 和 multiprocessing.Manager() 在“spawn”类型进程的情况下发生冲突

进程间的数据共享