2016-11-29 11 views
2

私は、さまざまなプリミティブ型と複合型のデータ型とオブジェクトを初期化するinitメソッドを持っています。マルチプロセスで生成された各プロセスでは、init()メソッドと初期化されたオブジェクトのアドレスから変数を出力しています。 変数のインスタンスが異なりますが、オブジェクトのアドレスは変わりません。ですから、マルチプロセス中に親クラスのメンバーに何が起こったのかを知りたいです。プロセスコール?自己オブジェクトはPythonのマルチプロセッシングで共有されますか?プロセス?

def __init__(self): 
    self.count = 0 
    self.db = pymongo.MongoClient() 

def consumerManager(self): 
    for i in range(4): 
     p = multiprocessing.Process(target = self.consumer, args = (i,)) 


def consumer(self, i): 
    while(1): 
     time.sleep(i) 
     self.count += 1 
     print self.count 
     print os.getpid() 
     print id(self.db) 

起こらない場合、id(self.db)は、各プロセス内で異なるIDを印刷する必要があり、オブジェクトのディープコピーを行っている場合。これはどのように行われますか?

+0

これはLinux用です – sreeraag

+0

私はdict {'a': 'b'}をinit()で初期化し、各プロセスでdictを変更した後にidを印刷していましたが、彼らはそのプロセスに固有のデータを保持しています – sreeraag

+0

代わりに 'Pool'を使ってみましたか? – Eduard

答えて

1

通常、Linuxでは新しいプロセスが作成されると、親のコピーが生成されます。

2つのプロセスは同じ状態になりますが、アドレス空間は異なります。

時間を節約するために、Linuxは両方とも変更しない限り、親と子のメモリを共有します。これは通常Copy On Writeと呼ばれます。

2つのプロセスが実行を継続するので、それらの状態は分岐します。情報を共有したい場合は、PipesShared memoryManagersおよびQueuesという異なるメカニズムを使用できます。

通常、単純さのために、パイプとキューが推奨されます。

同じIDが表示される理由は、次のとおりです。question新しいプロセスは親と同じメモリレイアウトを持つため、CPythonではidは同じになります。

関連する問題