2013-06-18 8 views
12

を使用してこれは初心者の質問です:Pythonのmultiprocessing.Processクラスに

クラスがオブジェクトであるので、私はpippo()というクラスを作成し、この内部の機能とパラメータを追加することができる機能ならば、私は理解していませんpippoの内部は、x=pippo()を割り当てたときに上から下に実行されますが、x.dosomething()の外にはpippo以外とする必要があります。 Pythonのマルチプロセッシングパッケージでの作業

、それは大きな関数を定義し、Process()の呼び出しでtarget引数を使用してオブジェクトを作成するか、またはProcessクラスから継承することで、独自のプロセスのクラスを作成するために良いですか?

+0

質問の最初の部分については、オブジェクトがインスタンス化されたときに関数を実行したい場合は、 '__init__'クラスのクラスにそのオブジェクトを呼び出すことができます。また、[プロパティデコレータ](http://docs.python.org/2/library/functions.html#property)もできます。私はあなたが第2部で何を求めているのか分かりません。明確にできますか? –

+0

ほとんどの場合、 'x.doSomthing()'のような、オブジェクトへの参照を介してクラスメソッドを呼び出すでしょう。クラス '__init__'メソッドから呼び出されることで、オブジェクトがインスタンス化されるとすぐにメソッドを内部的に使用することもできます。 オブジェクトのメソッドを「プロセスとして実行する」ようにするには、いくつかの方法があります。私の個人的な好みは、 'Process'からサブクラス化することです。私はここでこれを行う一つの方法を説明します:http://stackoverflow.com/questions/15790816/python-multiprocessing-apply-class-method-to-a-list-of-objects/16202411#16202411 – DMH

答えて

23

私はしばしば、multiprocessingのPythonのドキュメントページで、「機能的」アプローチ(targetパラメータを使用)のみを示しているのかどうか疑問に思っていました。たぶん、簡潔で簡潔なコードスニペットがイラストレーションの目的のために最適です。 1つの関数に収まる小さなタスクのために、私はそれは好ましい方法であるかを確認することができ、ALA:

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__()内のstuff)は、run()内のマスタプロセス専用コード内で実行され、別々のプロセスで実行されます。

したがって、プロセス(マスターまたは生成)がメンバー変数を変更した場合、変更は他のプロセスに反映されません。これはもちろん、bool,string,listなどのbulit-inタイプにのみ当てはまります。しかし、multiprocessingモジュールから "特別な"データ構造をインポートして、プロセス間で透過的に共有できます(Sharing state between processesを参照)。 multiprocessing.Pipeおよびmultiprocessing.Queueのような独自のIPC(プロセス間通信)チャネルを作成できます。

+2

マルチプロセッシングは必要ありません。 'if __name__ ==" __main __ "'あなたがWindows上で動いているなら? –

+0

注記されたもう一つの驚き派生プロセスがそのクラスのデータ型の一部を変更した場合、それらの変更はマスタープロセスから見えるでしょうか? – Woody1193

+0

@ Woody1193、組み込みのデータ型ではありません。しかし、 'multiprocessing'モジュールから特別な共有データ型を使用すると、目的の効果が得られます。 (私は上記の私の答えにこの説明を追加しました。) –