我对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会在进程之间自动共享。我想要得到这种行为我必须使用多处理管理器。有人可以解释发生了什么吗?
答案 0 :(得分:1)
在Linux上,分支进程并不会导致立即占用两倍的内存。相反,新进程的页表将被设置为指向与旧进程相同的物理内存,并且只有当其中一个进程尝试写入其中一个页面时,才会实际复制它们(复制到写,COW)。结果是,两个进程似乎都有单独的内存,但只有当进程实际触及内存时才会分配物理内存。