2016-11-29 40 views
2

我有一個初始化方法,它初始化各種原始和複雜的數據類型和對象。在由multiprocessing.Process產生的每個進程中,我從init()方法和初始化對象的地址打印變量。 我得到了變量的不同實例,但對象的地址保持不變。所以,想知道多處理過程中父類的成員到底發生了什麼。進程調用?自我對象是否會被Python的多重處理共享?

def __init__(self): 
    self.count = 0 
    self.db = pymongo.MongoClient() 

def consumerManager(self): 
    for i in range(4): 
     p = multiprocessing.Process(target = self.consumer, args = (i,)) 


def consumer(self, i): 
    while(1): 
     time.sleep(i) 
     self.count += 1 
     print self.count 
     print os.getpid() 
     print id(self.db) 

如果做對象的深層副本,然後id(self.db)應該是每一個過程,它不會發生內打印出一張不同的ID。這是如何完成的?

+0

這是用於linux的 – sreeraag

+0

我在init()中初始化了一個dict {'a':'b'},然後在每個進程中修改dict後打印id,但所有進程仍然具有相同的id值他們持有特定於該過程的數據 – sreeraag

+0

您是否嘗試過使用「Pool」? – Eduard

回答

1

通常在Linux上創建新進程時,會生成父級副本。

在開始時,兩個進程將處於相同的狀態,但具有不同的地址空間。

爲了節省時間,Linux與孩子共享父母的內存,直到兩者都不修改它爲止。這通常被稱爲Copy On Write

隨着兩個進程繼續執行,它們的狀態將發生分歧。如果您希望他們共享信息,您可以使用不同的機制:Pipes,Shared memory,ManagersQueues

通常,由於它們的簡單性,建議使用管道和隊列。

您看到相同ID的原因在以下question中解釋。由於新進程具有相同的父級內存佈局,因此在CPython中,ID將相同。

相關問題