2017-01-05 12 views
0

很多新的Python,我不知道這個用例。爲什麼我的數據沒有更新?我檢查了對象data無處不在(相同的內存位置),但其屬性未更新。Python多進程不更新對象屬性

代碼示例

from multiprocessing import Process 


class Data(object): 
    def __init__(self): 
     self.val1 = 0 
     self.val2 = 0 
     self.val3 = 0 
     self.val4 = 0 


class Test(object): 
    def __init__(self, data): 
     self.data = data 

    def update_val1(self): 
     self.data.val1 = 1 

    def update_val2(self): 
     self.data.val2 = 2 

    def update_val3(self): 
     self.data.val3 = 3 

    def update_val4(self): 
     self.data.val3 = 4 


data = Data() 
test = Test(data) 
jobs = [] 

p = Process(target=test.update_val1) 
jobs.append(p) 
p.start() 

p = Process(target=test.update_val2) 
jobs.append(p) 
p.start() 

p = Process(target=test.update_val3) 
jobs.append(p) 
p.start() 

p = Process(target=test.update_val3) 
jobs.append(p) 
p.start() 

for job in jobs: 
    job.join() 

print(data.val1) 
print(data.val2) 
print(data.val3) 
print(data.val4) 

我認爲這不是一個好辦法,我也好過data對象在隊列進程之間共享這個對象是這樣嗎?但是data對象在每個進程中都是一樣的,不是副本,所以我很困惑它爲什麼不起作用.....

回答

0

對象是一個副本。每個進程都有自己獨立於其他進程的內存空間,因此所有內容都被複制。

請參閱https://docs.python.org/2/library/multiprocessing.html#exchanging-objects-between-processeshttps://docs.python.org/2/library/multiprocessing.html#sharing-state-between-processes以瞭解如何跨進程邊界傳輸數據。

+0

這就是我的想法,但是當我在方法'update_val1'和'update_val2'中分解時,對象'data'是相同的(相同的內存塊)。這是我的IDE(PyCharm)的問題嗎? – GuillaumeA

+0

@GuillaumeA你怎麼知道它是否是相同的內存塊?分叉新過程不會改變任何東西的地址;新的過程只是一個完整的克隆。內存對每個進程都是本地的。 – melpomene

+0

好吧,我用一個經理名稱空間作爲共享對象來檢索每個處理結果。我不得不稍微修改我的類方法,但它的工作原理。我只是被PyCharm調試器弄糊塗了...... – GuillaumeA