Python的多处理过程是否会共享自我对象。进程?

时间:2016-11-29 09:48:03

标签: python linux multiprocessing

我有一个初始化各种原始和复杂数据类型和对象的init方法。在由multiprocessing.Process生成的每个进程中,我从init()方法打印变量并初始化对象的地址。 我得到变量的不同实例,但对象的地址保持不变。那么,想知道在multiprocessing.Process调用期间父类成员到底发生了什么?

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,这不会发生。这是怎么做到的?

1 个答案:

答案 0 :(得分:1)

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

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

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

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

通常,由于它们的简单性,Pipes和Queues是推荐的。

以下question说明了您看到相同ID的原因。由于新进程具有与父进程相同的内存布局,因此在CPython中,id将是相同的。