2016-05-04 2 views
3

を再作成しません。このコードは、私は次のような出力が得られます。マルチプロセッシングは、私は少しのコードスニペット(元のコードがはるかに大きい)オブジェクトを作成する関数を呼び出しますが、プロセスのプール内に作成したオブジェクト

PoolWorker-1, Address: <__main__.TestClass object at 0x7f05d3fdad50> 
PoolWorker-2, Address: <__main__.TestClass object at 0x7f05d3fdad50> 
  1. オブジェクトが同じアドレスを持っている理由私は理解していないがインクルードは別のプロセスであるにも関わらず、ありますか?

  2. すべてのプロセスが独自のオブジェクトを作成する方法を確認するにはどうすればよいですか?

ありがとうございました。

答えて

2

、異なるプロセスが異なるvirtual address spaceを使用して、異なるプロセスで同じアドレスは、異なるメモリ領域を指します。

あなたはあなたの例を少し変更する場合は、そのオブジェクトを返さ表示されますが異なっている:

import multiprocessing 

class TestClass(object): 
    pass 

def func(): 
    obj = TestClass() 
    cpname = multiprocessing.current_process().name 
    print "{0}, Address: {1}".format(cpname, str(obj)) 
    return obj 

pool = multiprocessing.Pool(2) 
results = [pool.apply_async(func) for _ in range(2)] 

results = [res.get() for res in results] 

pool.close() 
pool.join() 

print results 
3

fork()マルチプロセッシングでは、プロセスが複製されます。メモリアロケータと親プロセス内のすべてのアドレスは、子プロセスにコピーされます。その結果、次の割り当ては同じアドレスを持つ可能性が非常に高くなります。

あなたは、彼らが実際に分離されていることを確認することができますので、のようなオブジェクト:オブジェクトが異なっている

import time 

def func(): 
    obj = TestClass() 
    obj.name = multiprocessing.current_process().name 
    print obj.name, str(obj) 
    time.sleep(1) 
    print obj.name, str(obj) 
+0

私はあなたのコードを実行しました。アドレスは依然として同じである(またはそれが予想される)として、結果は、私ビットパズル: 'PoolWorker-1 <__メイン__ 0x7ffecd3c8d90にTestClassを対象> PoolWorker-2 <__メイン__ TestClassをオブジェクト0x7ffecd3c8d90で> PoolWorker -1 <__ main __。TestClassオブジェクト(0x7ffecd3c8d90)> PoolWorker-2 <__ main __。TestClassオブジェクト(0x7ffecd3c8d90)> ' – user1852692

+0

アドレスは仮想アドレッシングによって同じになると予想されます。マルチプロセッシングのためにプログラムをクローンすると、仮想アドレスは変更されませんが、基本となる物理メモリは変わりません。 – lunixbochs

1

は、おそらくあなたは新しいプロセスがfork()を介して作成しているLinuxっぽいシステムを、使用しているようです。その場合、がアドレス間で重複することが予想されます。つまり、同じobjインスタンスが同じ物理メモリを占有しているわけではなく、同じ仮想の(プロセスローカル)アドレスを共有しているだけです。

ここ

より:

What happens to address's, values, and pointers after a fork()

関連する問題