2017-08-31 53 views
1

我從multiprocessing.Process創建子類。如何在多處理中從start()和run()中更新屬性

對象p.run()可以從long_runtime_proc更新instance.ret_value,但p.start()無法獲取ret_value,儘管long_runtime_proc被調用並運行。

如何獲得p.start()的ret_value?

*class myProcess (multiprocessing.Process): 
    def __init__(self, pid, name, ret_value=0): 
     multiprocessing.Process.__init__(self) 
     self.id = pid 
     self.ret_value = ret_value 
    def run(self): 
     self.ret_value = long_runtime_proc (self.id)* 

回答

0

調用Process.run()直接確實啓動一個新的過程,即在Process.run()代碼在相同過程調用它被執行。這就是爲什麼對self.ret_value的更改有效。但是,您不應直接撥打Process.run()

當你Process.start()啓動子創建了一個新的子進程,然後在Process.run()代碼在這種新工藝執行。當您將long_runtime_proc的返回值分配給self.ret_value時,會發生在子進程中,而不是父進程,因此父級ret_vaule未更新。

您可能需要做的是使用管道或隊列將返回值發送給父進程。詳情請參閱documentation。下面是一個使用隊列的示例:

import time 
import multiprocessing 

def long_runtime_proc(): 
    '''Simulate a long running process''' 
    time.sleep(10) 
    return 1234 

class myProcess(multiprocessing.Process): 
    def __init__(self, result_queue): 
     self.result_queue = result_queue 
     super(myProcess, self).__init__() 

    def run(self): 
     self.result_queue.put(long_runtime_proc()) 

q = multiprocessing.Queue() 
p = myProcess(q) 
p.start() 
ret_value = q.get() 
p.join() 

有了這個代碼ret_value最終會被分配從隊列的值,這將是1234

+0

感謝您的repy。 p.run()只是在主進程中運行它的進程而不是子進程,所以它可以返回值給主進程。而且這不是我所需要的。 p.start()確實會調用一個新進程,但不能將值傳遞給父進程。 – xinwu

+0

@xinwu:正確,這就是我說的:'p.run()'運行在同一個進程中,所以你可以得到結果。 'p.start()'在子進程中運行'run()'方法。如果您進一步閱讀我的答案,您會看到解決方案是使用隊列或某種其他形式的進程間通信。 – mhawke

+0

是的,我可以使用隊列或管道從並行進程獲取返回值。感謝您的回覆。 – xinwu