为什么多处理模块产生的进程不会重复内存?

时间:2015-01-21 17:51:29

标签: python multiprocessing

我对python多处理的印象是,当您使用multiprocessing.Process()创建新进程时,它会在内存中创建当前程序的完整副本并继续从那里开始工作。考虑到这一点,我对以下脚本的行为感到困惑。

警告:此脚本将分配大量内存!小心运行!

import multiprocessing
import numpy as np
from time import sleep

#Declare a dictionary globally
bigDict = {}

def sharedMemory():
    #Using numpy, store 1GB of random data
    for i in xrange(1000):
        bigDict[i] = np.random.random((125000))
    bigDict[0] = "Known information"

    #In System Monitor, 1GB of memory is being used
    sleep(5)

    #Start 4 processes - each should get a copy of the 1GB dict
    for _ in xrange(4):
        p = multiprocessing.Process(target=workerProcess)
        p.start()

    print "Done"

def workerProcess():
    #Sleep - only 1GB of memory is being used, not the expected 4GB
    sleep(5)

    #Each process has access to the dictionary, even though the memory is shared
    print multiprocessing.current_process().pid,bigDict[0]

if __name__ == "__main__":
    sharedMemory()

上面的程序说明了我的困惑 - 似乎dict会在进程之间自动共享。我想要得到这种行为我必须使用多处理管理器。有人可以解释发生了什么吗?

1 个答案:

答案 0 :(得分:1)

在Linux上,分支进程并不会导致立即占用两倍的内存。相反,新进程的页表将被设置为指向与旧进程相同的物理内存,并且只有当其中一个进程尝试写入其中一个页面时,才会实际复制它们(复制到写,COW)。结果是,两个进程似乎都有单独的内存,但只有当进程实际触及内存时才会分配物理内存。