[英]Python multiprocessing shared dict inside a class
我想了解多處理和管理器如何工作以共享內存
我有一個類,在類上創建了一個字典。 init我想使用多處理來調用填充字典的類函數(每個進程添加一個不同的鍵)。
import multiprocessing as mp
from multiprocessing import Process, Manager
class num:
def __init__(self):
manager = Manager()
d = manager.dict()
# Setup list of processes
processes = [mp.Process(target=self.f, args=(d,i)) for i in range(5)]
#Run processes
for p in processes:
p.start()
#Exit the completed processes
for p in processes:
p.join()
print d
def f(self,d,i):
d[str(i)] = []
d[str(i)].append(i)
if __name__ == '__main__':
test = num()
結果:
{'1': [], '0': [], '3': [], '2': [], '4': []}
f()里面的列表也需要共享嗎? 怎么樣和為什么?
您需要更改函數f
的行:
d['i'] = [i]
喜歡的東西
d[str(i)] = i
這樣你的進程就不會覆蓋共享字典中的彼此的條目。 在那之后,它適用於我(在Python 2.7.3中),打印出來
{'1': 1, '0': 0, '3': 3, '2': 2, '4': 4}
(另外,您發布的代碼缺少import multiprocessing as mp
)
更新 :如果您只想將共享字典中的值作為列表,那么這是一個簡單的更改,例如
d[str(i)] = [i]
如果您希望在所有進程中共享每個列表,那么您可能需要使用manager.list()
在主進程中創建這些列表,並將這些列表傳遞給所有子進程,例如:
count = 5
lists = [manager.list() for i in range(count)]
for i in range(count):
d[i] = lists[i]
processes = [mp.Process(target=self.f, args=(d,i, lists)) for i in range(count)]
[...]
def f(self,d,i, lists):
for j in range(i): # just an example to show
lists[j].append(i) # that the lists are shared between processes
我還嘗試直接在托管dict中嵌套托管列表,但由於某種原因,這不起作用,並且子進程無法更新列表。 如圖所示單獨傳遞它們似乎有效,例如我可以讓每個子進程更新多個列表:
{0: [1, 2, 3, 4], 1: [2, 3, 4], 2: [3, 4], 3: [4], 4: []}
更換:
d[str(i)].append(i)
有:
d[str(i)] += [i]
解決這個問題。
結果:
{'1': [1], '0': [0], '3': [3], '2': [2], '4': [4]}
但我真的想知道為什么。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.