Python のマルチプロセッシング モジュールに関するさまざまなチュートリアルを読んでいますが、なぜ/いつ呼び出すのか理解できませんprocess.join()
。たとえば、次の例に出くわしました。
nums = range(100000)
nprocs = 4
def worker(nums, out_q):
""" The worker function, invoked in a process. 'nums' is a
list of numbers to factor. The results are placed in
a dictionary that's pushed to a queue.
"""
outdict = {}
for n in nums:
outdict[n] = factorize_naive(n)
out_q.put(outdict)
# Each process will get 'chunksize' nums and a queue to put his out
# dict into
out_q = Queue()
chunksize = int(math.ceil(len(nums) / float(nprocs)))
procs = []
for i in range(nprocs):
p = multiprocessing.Process(
target=worker,
args=(nums[chunksize * i:chunksize * (i + 1)],
out_q))
procs.append(p)
p.start()
# Collect all results into a single result dict. We know how many dicts
# with results to expect.
resultdict = {}
for i in range(nprocs):
resultdict.update(out_q.get())
# Wait for all worker processes to finish
for p in procs:
p.join()
print resultdict
私が理解していることからprocess.join()
、 join メソッドが呼び出されたプロセスの実行が完了するまで、呼び出しプロセスをブロックします。また、上記のコード例で開始された子プロセスは、ターゲット関数の完了時に実行を完了すると考えています。つまり、結果を にプッシュした後out_q
です。最後に、out_q.get()
プルする結果が得られるまで呼び出しプロセスをブロックすると思います。したがって、コードを検討すると、次のようになります。
resultdict = {}
for i in range(nprocs):
resultdict.update(out_q.get())
# Wait for all worker processes to finish
for p in procs:
p.join()
メイン プロセスは、すべてのワーカー プロセスがその結果をキューにプッシュし終わるout_q.get()
まで、呼び出しによってブロックされます。したがって、メイン プロセスが for ループを終了するまでに、各子プロセスは実行を完了しているはずですよね?
その場合、p.join()
この時点でメソッドを呼び出す理由はありますか? すべてのワーカー プロセスがまだ終了していない場合、メイン プロセスはどのようにして「すべてのワーカー プロセスが終了するのを待つ」ようになるのでしょうか? 私が質問する主な理由は、これを複数の異なる例で見たことがあるためです。何かを理解できていないかどうか知りたいです。