2017-11-16 16 views
1

下記のコードをご確認ください。なぜPythonマルチプロセッシングで更新されないのですか?

私はdictを初期化し、それを関数fに送ります。私はreturn_dictのアドレスを調べました。それはプロセス内で変更されていません。だから私はdictが更新されるべきだと思った。

しかし、それはなぜ更新されないのですか?あなたのProcess()

from multiprocessing import Process 

return_dict = dict({}) 
print id(return_dict) 


def f(value, return_dict): 
    return_dict['value'] = value 
    print return_dict 


p = Process(target=f, args=(100, return_dict)) 
p.start() 
p.join() 
print return_dict 

答えて

4

は別のプロセスを作成します。子プロセスが生成されたときに親プロセスからオブジェクトを継承しますが、これらのオブジェクトを変更すると子プロセスメモリ内のオブジェクトのみが変更され、これらの変更は親には見えません。

あなたはManager()を使用してこれを克服することができます

from multiprocessing import Process, Manager 

def f(value, return_dict): 
    return_dict['value'] = value 
    print return_dict 

d = Manager().dict()  
p = Process(target=f, args=(100, d)) 
p.start() 
p.join() 
print d 
+0

しかしreturn_dictのメモリアドレスが変更されていません。それを説明する方法?それらが異なるオブジェクトである場合、アドレスは私が考えると同じであってはなりません。それらが同じオブジェクトであれば、変更は親プロセスに見えるようにする必要があります –

+0

私は、メモリアドレスがプロセスのメモリ空間に相対的であり、コンピュータのメモリ内の絶対アドレスではないと仮定します。親プロセス内のオブジェクトがヒープの位置Xにある場合、子プロセスが生成されると、これは1対1のコピーを受け取ります。オブジェクトアドレスは、コンピュータ内の異なるプロセスおよび異なるメモリセグメントであっても、Xのままです。とにかく、セグメンテーション違反の原因となるため、子プロセスは親プロセスメモリにアクセスできません。 – Hannu

関連する問題