從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