2013-06-18 68 views
12

這是一個新手的問​​題:使用Python的multiprocessing.Process類

類是一個對象,這樣我就可以創建一個名爲這個附加功能和參數的pippo()和內部類,我不若函數理解當我分配x=pippo()或者我必須在pippo之外呼叫它們作爲x.dosomething()時,pippo內部從上到下執行。

與Python的多包工作,是它更好地定義一個大的功能和使用呼叫的target參數創建對象,以Process(),或從Process類繼承來創建自己的流程類?

+0

對於您的問題的第一部分,如果您希望在實例化對象時執行某個函數,則可以在類'__init__'函數中對其進行調用。你也可以是[property decorator](http://docs.python.org/2/library/functions.html#property)。我不確定你在第二部分要問什麼。你能澄清嗎? –

+0

大多數情況下,您將通過對象的引用來調用類方法,例如'x.doSomthing()'。您也可以在對象實例化後立即在內部使用這些方法,方法是從__init__方法調用它們。 如果你想要一個對象的方法「作爲一個進程運行」,有幾種方法可以做到這一點。我個人最喜歡的是從'Process'子類。我解釋一種方法來做到這一點:http://stackoverflow.com/questions/15790816/python-multiprocessing-apply-class-method-to-a-list-of-objects/16202411#16202411 – DMH

回答

23

我經常想知道爲什麼Python的doc頁multiprocessing只顯示「功能」的方法(使用target參數)。可能因爲簡潔,簡潔的代碼片段最適合用於說明目的。對於符合功能於一體的小任務,我可以看到這是首選的方式,鼻翼:

from multiprocessing import Process 

def f(): 
    print('hello') 

p = Process(target=f) 
p.start() 
p.join() 

但是當你需要更大的代碼組織(對於複雜的任務),使自己的類是要走的路:

from multiprocessing import Process 

class P(Process): 
    def __init__(self): 
     super(P, self).__init__() 
    def run(self): 
     print('hello') 

p = P() 
p.start() 
p.join() 

請記住,每個派生進程都使用主進程的內存佔用量的副本進行初始化。並且構造函數代碼(即__init__()中的內容)在主進程中執行 - run()中的只有代碼在不同的進程中執行。

因此,如果一個進程(master或者spawned)改變了它的成員變量,那麼這個改變將不會反映到其他進程中。當然,這僅適用於嵌入式類型,例如bool,string,list等。然而,您可以從multiprocessing模塊導入「特殊」數據結構,然後在進程間透明共享(請參閱Sharing state between processes。)或者,您可以創建您自己的IPC(進程間通信)通道,如multiprocessing.Pipemultiprocessing.Queue

+2

不需要多處理如果您在Windows上運行,如果__name__ ==「__main __」''另一個值得注意的驚喜 –

+0

如果生成的進程在其類中更改了某些數據類型,那麼這些更改將在主進程中可見? – Woody1193

+0

@ Woody1193,不適用於內置數據類型。但是,如果您使用'multiprocessing'模塊中的特殊共享數據類型,您將獲得所需的效果。 (我在上面的答案中添加了這個解釋。) –

相關問題