self 对象会被 Python 的 multiprocessing.Process 共享吗?

sre*_*aag 5 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)
Run Code Online (Sandbox Code Playgroud)

如果它正在执行对象的深层复制,那么id(self.db)应该在每个进程中打印不同的 id,但这种情况不会发生。这是怎么做到的?

nox*_*fox 3

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

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

为了节省时间,Linux 与子进程共享父进程的内存,直到双方都不再修改它。这通常称为写入时复制

当两个进程继续执行时,它们的状态将会有所不同。如果您希望它们共享信息,您可以使用不同的机制:管道共享内存管理器队列

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

以下问题解释了您看到相同 id 的原因。由于新进程与父进程具有相同的内存布局,因此在 CPython 中,id 将相同。