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方法時需要注意,在操作共享對象時候,除了賦值操作,其他的方法都作用在共享對象的拷貝上,並不會對共享對象生效。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM