0

マルチプロセッシングモジュールを使用しているときに、共有変数(名前空間のnumpy配列)を更新しようとしています。しかし、変数は更新されていませんし、理由を理解できません。ここでマルチプロセッシング共有変数が更新されない

はこれを説明するためのサンプルコードです:

from multiprocessing import Process, Manager 
import numpy as np 

chunk_size = 15 
arr_length = 1000 
jobs = [] 
namespace = Manager().Namespace() 
namespace.arr = np.zeros(arr_length) 
nb_chunk = arr_length/chunk_size + 1 


def foo(i, ns): 
    from_idx = chunk_size*i 
    to_idx = min(arr_length, chunk_size*(i+1)) 
    ns.arr[from_idx:to_idx] = np.random.randint(0, 100, to_idx-from_idx) 

for i in np.arange(nb_chunk): 
    p = Process(target=foo, args=(i, namespace)) 
    p.start() 
    jobs.append(p) 
for i in np.arange(nb_chunk): 
    jobs[i].join() 

print namespace.arr[:10] 

答えて

0

の問題はManager().Namespace()オブジェクトが気づかないことですns.arr[from_idx:to_idx] = ...を使用して何かを変更しようとしているため、他のプロセスには伝播しません。

This answerここでは非常に良いことが説明されています。

Manager().List()としてリストを作成し、それを修正し、ns[from_idx:to_idx] = ...が変更として認識され、プロセスに伝播されるように、プロセスにこのリストを渡すには:

from multiprocessing import Process, Manager 
import numpy as np 

chunk_size = 15 
arr_length = 1000 
jobs = [] 
arr = Manager().list([0] * arr_length) 

nb_chunk = arr_length/chunk_size + 1 


def foo(i, ns): 
    from_idx = chunk_size*i 
    to_idx = min(arr_length, chunk_size*(i+1)) 
    ns[from_idx:to_idx] = np.random.randint(0, 100, to_idx-from_idx) 

for i in np.arange(nb_chunk): 
    p = Process(target=foo, args=(i, arr)) 
    p.start() 
    jobs.append(p) 
for i in np.arange(nb_chunk): 
    jobs[i].join() 

print arr[:10] 
1

あなたは、内蔵listのようなオブジェクトのPythonでのプロセス間dictを共有することはできません。プロセス間でデータを共有するために、Python's multiprocessingは、2つのデータ構造を提供する:

また読み出す:Exchanging objects between processes

+0

[OK]を、私はどのように取ることができます各プロセスで、私は配列の同じメモリ空間にアクセスしないという利点がありますか? – GuillaumeA

+0

あなたの現在のコードに似ていますが、関数の引数(あなたの場合は 'foo()')に渡してください。 [複数の非同期関数を実行し、各関数の戻り値を取得する]を参照することもできます(http://stackoverflow.com/questions/40536287/running-multiple-asynchronous-function-and-get-the-returned-value-of- each-functi)、私が過去に尋ねた質問。 'Queue'の使い方に答えています –

関連する問題