Python multiprocessing.Pool不会永久影响类变量

Python multiprocessing.Pool不会永久影响类变量,python,python-multiprocessing,Python,Python Multiprocessing,我正在使用multiprocessing.Pool将一个方法的工作分配到多个处理器上。当我向字典中添加某个内容时,该方法执行后,该内容将丢失。为什么呢?如何规避呢 from multiprocessing import Pool class Agent: def __init__(self): self.test_dict = {} def apply(self, num): # something very processor intens

我正在使用multiprocessing.Pool将一个方法的工作分配到多个处理器上。当我向字典中添加某个内容时,该方法执行后,该内容将丢失。为什么呢?如何规避呢

from multiprocessing import Pool


class Agent:
    def __init__(self):
        self.test_dict = {}

    def apply(self, num):
        # something very processor intensive here
        self.test_dict[num] = num
        print 'inside ', self.test_dict

def F(x):
    agent, i = x
    return agent.apply(i)

class SeriesInstance(object):
    def __init__(self):
        self.agent = Agent()
        self.F = F

    def run(self):
        p = Pool()

        for i in range(5):
            out = p.map(F, [(self.agent, i),])

            print 'outside', self.agent.test_dict


        p.close()
        p.join()

        return out

if __name__ == '__main__':
    SeriesInstance().run()
输出是这样的,但是外部应该等于内部

inside  {0: 0}
outside {}
inside  {1: 1}
outside {}
inside  {2: 2}
outside {}
inside  {3: 3}
outside {}
inside  {4: 4}
outside {}
请检查并阅读服务器进程部分。似乎您必须创建一个管理器,并使用该管理器来创建
代理
类中使用的
dict
实例

from multiprocessing import Process, Manager

def f(d, l):
    d[1] = '1'
    d['2'] = 2
    d[0.25] = None
    l.reverse()

if __name__ == '__main__':
    with Manager() as manager:
        d = manager.dict()
        l = manager.list(range(10))

        p = Process(target=f, args=(d, l))
        p.start()
        p.join()

        print(d)
        print(l)

Noctis Skytower有一个解决方案,但更一般的答案是,除非有充分的理由,否则不应该尝试在进程之间共享状态

要理解为什么行为是这样的,请查看一个类似的问题。在另一个进程中更改对象时,实际上是在更改该对象的副本。也就是说,您的对象在子流程中重新创建,而不是直接使用


在文档中,您可以看到您基本上希望传递简单的消息,而不是沉重的对象。这可能意味着您需要重新设计您的工作流程。

实际代码中可能存在重复的,这其中的哪部分是处理器密集型工作?不,实际代码很长时间才会发布在此处处理器密集型任务将在代理的应用功能中。