2016-11-21 26 views
0

我想知道爲什麼子進程打印出不同的對象地址。我也曾經和一位經理一起嘗試過,但並不影響結果。Python多處理:爲什麼對象實例沒有相同的地址?

import time 
import multiprocessing as mp 

class TestO: 
    def __init__(self, a): 
     self.a = a 

    def get_name(self): 
     return self.a 



def run_task(tasks,nr): 
    obj = tasks[nr]['data'] 
    print obj, obj.get_name() 



if __name__ == "__main__": 

    tasks = dict() 

    a = TestO('first') 
    b = TestO('second') 

    tasks[1] = {'data': a} 
    tasks[2] = {'data': b} 


    process1 = mp.Process(target = run_task, name = 'process1', args = (tasks, 1)) 
    process2 = mp.Process(target = run_task, name = 'process2', args = (tasks, 2)) 

    process1.start() 

    time.sleep(0.2) 

    process2.start() 

    process1.join() 
    process2.join() 


    print a, 'first' 
    print b, 'second' 

這會給結果

<__main__.TestO instance at 0x02EFD2D8> first 
<__main__.TestO instance at 0x0373D300> second 
<__main__.TestO instance at 0x043663C8> first 
<__main__.TestO instance at 0x043663F0> second 

是情況下被複制?有沒有辦法保持同一個實例?我遇到了上述類對象更復雜的更復雜版本的問題。在這種情況下得到的結果是,我在對象實例上設置的值在輸入mp.Process後無效,即obj.get_name返回None

回答

1

您正在產卵多個進程。由於虛擬內存的魔力,你不能(不能)期望兩個不同的進程擁有相同的地址。

至於你的問題:

有沒有辦法保持相同的情況下以某種方式?

不是真的,因爲您正在啓動單獨的進程。儘管如果你堅持,你可以使用「共享內存」在進程之間共享一個數據結構的單個實例。

+0

我將如何使用我提供的示例使用共享內存?我認爲使用管理器將與共享內存相同,但在這種情況下我也獲得了不同的地址。 – Chicony

+0

我可能會錯,但由於GIL阻止真正的共享內存,是不是'mp.Process'序列化的參數? – erip

+1

@Chicony:如果您使用管理器,您可以獲得共享,但由於「虛擬內存」,地址仍然會有所不同。閱讀虛擬內存,你會看到。僅僅因爲有兩件事情生活在兩個不同的虛擬地址,並不能告訴你它們是否是同一個實例,當你談論兩個不同的過程時。 –

相關問題