自我对象是否会被Python的多重处理共享?

问题描述:

我有一个初始化方法,它初始化各种原始和复杂的数据类型和对象。在由multiprocessing.Process产生的每个进程中,我从init()方法和初始化对象的地址打印变量。 我得到了变量的不同实例,但对象的地址保持不变。所以,想知道多处理过程中父类的成员到底发生了什么。进程调用?自我对象是否会被Python的多重处理共享?

def __init__(self): 
    self.count = 0 
    self.db = pymongo.MongoClient() 

def consumerManager(self): 
    for i in range(4): 
     p = multiprocessing.Process(target = self.consumer, args = (i,)) 


def consumer(self, i): 
    while(1): 
     time.sleep(i) 
     self.count += 1 
     print self.count 
     print os.getpid() 
     print id(self.db) 

如果做对象的深层副本,然后id(self.db)应该是每一个过程,它不会发生内打印出一张不同的ID。这是如何完成的?

+0

这是用于linux的 – sreeraag

+0

我在init()中初始化了一个dict {'a':'b'},然后在每个进程中修改dict后打印id,但所有进程仍然具有相同的id值他们持有特定于该过程的数据 – sreeraag

+0

您是否尝试过使用“Pool”? – Eduard

通常在Linux上创建新进程时,会生成父级副本。

在开始时,两个进程将处于相同的状态,但具有不同的地址空间。

为了节省时间,Linux与孩子共享父母的内存,直到两者都不修改它为止。这通常被称为Copy On Write

随着两个进程继续执行,它们的状态将发生分歧。如果您希望他们共享信息,您可以使用不同的机制:Pipes,Shared memory,ManagersQueues

通常,由于它们的简单性,建议使用管道和队列。

您看到相同ID的原因在以下question中解释。由于新进程具有相同的父级内存布局,因此在CPython中,ID将相同。