Python multiprocessing.Pool不会永久影响类变量
我正在使用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
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有一个解决方案,但更一般的答案是,除非有充分的理由,否则不应该尝试在进程之间共享状态 要理解为什么行为是这样的,请查看一个类似的问题。在另一个进程中更改对象时,实际上是在更改该对象的副本。也就是说,您的对象在子流程中重新创建,而不是直接使用
在文档中,您可以看到您基本上希望传递简单的消息,而不是沉重的对象。这可能意味着您需要重新设计您的工作流程。实际代码中可能存在重复的,这其中的哪部分是处理器密集型工作?不,实际代码很长时间才会发布在此处处理器密集型任务将在代理的应用功能中。