Pool.map与地图

时间:2018-01-23 22:04:11

标签: python

道歉,如果这是一个重复,但是,我似乎无法理解围绕可变性的一些规则。我的场景类似于下面的场景:

from multiprocessing import Pool;

class myObj:

    def __init__(self):
        self.results = [];

    def doThing(self):
        self.results.append(1);

def wrapDoThing(o):
    o.doThing();
    return o;

objList = [myObj(),myObj()];

map(wrapDoThing,objList);

print(len(objList[0].results)); #prints 1

tPool = Pool(2);

tPool.map(wrapDoThing,objList);

print(len(objList[0].results)); #prints 1 - why?

我有一个具有实例字段的类,以及一个更新该实例字段的方法,从而更新对象状态。 如果我使用内置map(我使用在顶级声明的函数作为包装器 - 稍后更清楚),方法调用将针对每个对象进行,并更新状态,如results字段中所示该班的长度为1。

当我使用Pool.map时(这就是为什么我使用了包装器,因为我不相信我可以使用lambda,可以吗?),该方法的效果似乎并不成立,并且我不确定为什么会这样?

1 个答案:

答案 0 :(得分:0)

使用多处理,可以产生不同的python进程。

然而,主要的Python进程不会与新生成的进程共享它的状态(它们不会彼此共享)。

您传递给map的对象被序列化并发送到这些进程,但除了map的结果之外,它们从未返回到主进程。他们确实增加了,但仅限于后来以静脉死亡的其他过程: - (

如果您确实希望共享状态,则可以使用许多共享变量,内存和托管进程。

有关详情,请参阅multiprocessing's documentation