私はしばしば、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(プロセス間通信)チャネルを作成できます。
質問の最初の部分については、オブジェクトがインスタンス化されたときに関数を実行したい場合は、 '__init__'クラスのクラスにそのオブジェクトを呼び出すことができます。また、[プロパティデコレータ](http://docs.python.org/2/library/functions.html#property)もできます。私はあなたが第2部で何を求めているのか分かりません。明確にできますか? –
ほとんどの場合、 'x.doSomthing()'のような、オブジェクトへの参照を介してクラスメソッドを呼び出すでしょう。クラス '__init__'メソッドから呼び出されることで、オブジェクトがインスタンス化されるとすぐにメソッドを内部的に使用することもできます。 オブジェクトのメソッドを「プロセスとして実行する」ようにするには、いくつかの方法があります。私の個人的な好みは、 'Process'からサブクラス化することです。私はここでこれを行う一つの方法を説明します:http://stackoverflow.com/questions/15790816/python-multiprocessing-apply-class-method-to-a-list-of-objects/16202411#16202411 – DMH