【问题标题】:Python multiprocessing shared dict inside a class类中的Python多处理共享字典
【发布时间】:2015-02-03 08:42:26
【问题描述】:

我想了解多处理和管理器如何工作以共享内存

我有一个类,其中包含在类上创建的字典。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() 中的列表也需要共享?如何以及为什么?

【问题讨论】:

  • DNA 回答后的问题更新,以便更具体

标签: python dictionary shared-memory


【解决方案1】:

您需要将函数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

我也尝试将托管列表直接嵌套在托管字典中,但由于某种原因这不起作用,并且子进程无法更新列表。如图所示分别传递它们似乎有效,例如我可以让每个子进程更新多个列表:

{0: [1, 2, 3, 4], 1: [2, 3, 4], 2: [3, 4], 3: [4], 4: []}

【讨论】:

  • 谢谢!我将问题更新为更具体。我需要 dict 的值是列表 - 也需要共享列表内存吗?怎么样?
【解决方案2】:

替换:

d[str(i)].append(i)

与:

d[str(i)] += [i]

解决问题。

结果:

{'1': [1], '0': [0], '3': [3], '2': [2], '4': [4]}

但我真的很想知道为什么。

【讨论】:

    猜你喜欢
    • 2011-05-30
    • 2013-06-26
    • 2023-03-10
    • 2020-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-31
    • 2016-11-14
    相关资源
    最近更新 更多