2011-05-12 71 views
11
from multiprocessing import Process 
# c is a container 
p = Process(target = f, args = (c,)) 
p.start() 

我假設的c深拷貝傳遞給函數f因爲淺拷貝會建立一個新的進程的情況下沒有意義(新進程沒有從調用進程訪問數據)。python多處理參數:深拷貝?

這是怎麼回事深層副本定義?這裏有一整set of notescopy.deepcopy()文檔中,做所有這些說明適用於這裏? multiprocessing文檔中沒有提及任何內容...

回答

9

當您創建Process實例時,Python會發出一個fork()。這將創建一個子進程,其內存空間是其母公司的精確拷貝 - 所以一切都存在於叉的時間被複制

在Linux上,這是通過「寫入時複製」造高效。從fork man page

叉()創建一個子進程 僅從 在其PID與PPID,以及這樣的事實,即 資源利用被設置爲0。 文件鎖定和未決父進程的不同之信號不會被遺傳。

在Linux下,fork()的實現 使用寫入時複製頁,所以只能 點球,這招是複製 家長的頁表,並創建一個 唯一需要的時間和 內存孩子的任務結構。

+0

+1。請注意,Windows使用與fork()不同的機制,但效果相似。 – 2011-05-12 19:33:18

+0

這是正確的,但必須指出,沒有任何東西被複制是不正確的。 Python的垃圾收集器需要維護引用計數。雖然(我認爲每個進程4kb),但是這種內存開銷可以忽略不計。 – 2015-09-20 19:54:21