答えは実に簡単です。複数の異なる python プロセスを開始する multiprocessing モジュールを使用しています。プロセスごとに異なるアドレス空間があり、メモリを共有しないため、すべてのプロセスがディクショナリの独自のローカル コピーに書き込みます。
マルチプロセッシング モジュールを使用してプロセス間通信を行う最も簡単な方法は、キューを使用してスレーブ プロセスとマスター プロセス間で通信することです。
from multiprocessing import Process, Queue
def computeCopyNum(queue, val):
queue.put(val) # can also put a tuple of thread-id and value if we would like to
procs=list()
queue = Queue()
for i in range(1,3):
p = Process(target=computeCopyNum, args=(queue, i))
procs.append(p)
p.start()
for _ in procs:
val = queue.get()
# do whatever with val
for p in procs:
p.join()
各スレーブプロセスが複数の出力値を生成できる場合は、各スレーブプロセスがセンチネル値をキューに書き込んで、マスターに完了したことを通知するのが賢明かもしれません。次に、コードは次のようになります。
def slave(queue):
for i in range(128): # just for example
val = #some calculated result
queue.put(val)
queue.put(None) # add a sentinel value to tell the master we're done
queue = Queue()
# spawn 32 slave processes
num_procs = 32
procs = [Process(target=slave, args=(queue, )) for _ in range(num_procs)]
for proc in procs:
proc.start()
finished = 0
while finished < num_procs:
item = queue.get()
if item is None:
finished += 1
else:
# do something with item
for proc in procs:
proc.join()
別の回答に示されているように、マネージャーを使用することもできます。このアプローチの問題点は、プロセスのアドレス空間間で多くの暗黙的なメモリ コピーが発生する可能性があり、それを判断するのが難しいことです。私は常に明示的なキューを使用することを好みます。