如何进行多处理以更改原始对象的状态?

时间:2013-04-15 05:04:18

标签: python multiprocessing

我认为我理解这个问题,当一个multiprocessing.Pool.map工作者抓住它的下一个赋值时,根据文档将参数作为一个挑选对象传递。如果返回值是您要查找的内容,这很好,但是如果我想调用一个能够并行更改对象的状态的函数呢?例如,考虑一下简单的对象:

from multiprocessing import Pool

class state():
    def __init__(self):
        self.z = 0
    def __repr__(self): 
        return "%s"%self.z
    def compute(self):
        print "Computing"
        self.z += 1

使用此对象进行一些操作:

def compute_function(x): x.compute()

A = [state() for _ in xrange(3)]
print A
A[2].compute()
print A
map(compute_function, A)
print A
P = Pool()
P.map(compute_function, A)
print A

输出结果为:

[0, 0, 0]
Computing
[0, 0, 1]
Computing
Computing
Computing
[1, 1, 2]
Computing
Computing
Computing
[1, 1, 2]

但我希望得到最后一行来阅读[2, 2, 3]。显然,compute被调用,但结果对象被丢弃了。我如何“保持国家”?

1 个答案:

答案 0 :(得分:1)

你不能。酸洗不允许您将状态更改发送回腌制对象。你能做的最简单的事情是:

def compute_function(x):
    x.compute()
    return x

A = [state() for _ in xrange(3)]
A = P.map(compute_function, A)

作为替代方案,您可以使用multiprocessing.Manager创建对象并将其放在单独的进程中,并为其他进程提供代理。但请注意,这意味着通过代理对对象的任何操作将在 slow 的进程之间进行通信。