您需要更改函数中的行f
from:
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
)
Update:如果您只想将共享字典中的值作为列表,那么这是一个简单的更改,例如
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
我还尝试直接将托管列表嵌套在托管字典中,但由于某种原因这不起作用,并且子进程无法更新列表。如图所示单独传递它们似乎可行,例如我可以让每个子进程更新多个列表:
{0: [1, 2, 3, 4], 1: [2, 3, 4], 2: [3, 4], 3: [4], 4: []}