从this question及其答案,我想我明白为什么这个Python代码:共享内存和多
big_list = [
{j: 0 for j in range(200000)}
for i in range(60)
]
def worker():
for dic in big_list:
for key in dic:
pass
print "."
time.sleep(0.2)
w = multiprocessing.Process(target=worker)
w.start()
time.sleep(3600)
保持其执行过程中使用越来越多的内存:这是因为孩子的过程中更新引用计数到循环中的共享内存对象,触发“写时复制”mecanism(我可以通过cat /proc/meminfo | grep MemFree
观看可用内存减少)。
我不明白,但是,这就是为什么同样的事情发生,如果反复发生在父母,而不是孩子:
def worker():
time.sleep(3600)
w = multiprocessing.Process(target=worker)
w.start()
for dic in big_list:
for key in dic:
pass
print "."
time.sleep(0.2)
孩子甚至不需要知道存在的big_list
。
在这个小例子中,我可以通过将del big_list
放入子函数来解决问题,但有时候变量引用不能像这样访问,所以事情变得复杂。
为什么这种机械化发生,我该如何避免它正常?
您的结果和问题可能是操作系统(Unix/Linux/OSX)的依赖。他们肯定没有正确编码Windows(没有'if __name__ =='__main __':',参见[**主模块**的安全导入](https://docs.python.org/3/library/multiprocessing .html#the-spawn-and-forkserver-start-methods)在文档中)。 – martineau