我經常想知道爲什麼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.Pipe
和multiprocessing.Queue
。
對於您的問題的第一部分,如果您希望在實例化對象時執行某個函數,則可以在類'__init__'函數中對其進行調用。你也可以是[property decorator](http://docs.python.org/2/library/functions.html#property)。我不確定你在第二部分要問什麼。你能澄清嗎? –
大多數情況下,您將通過對象的引用來調用類方法,例如'x.doSomthing()'。您也可以在對象實例化後立即在內部使用這些方法,方法是從__init__方法調用它們。 如果你想要一個對象的方法「作爲一個進程運行」,有幾種方法可以做到這一點。我個人最喜歡的是從'Process'子類。我解釋一種方法來做到這一點:http://stackoverflow.com/questions/15790816/python-multiprocessing-apply-class-method-to-a-list-of-objects/16202411#16202411 – DMH