web-dev-qa-db-ja.com

multiprocessing.Pool.joinをいつ呼び出す必要がありますか?

私は次のように「multiprocess.Pool.imap_unordered」を使用しています

from multiprocessing import Pool
pool = Pool()
for mapped_result in pool.imap_unordered(mapping_func, args_iter):
    do some additional processing on mapped_result

Forループの後にpool.closeまたはpool.joinを呼び出す必要がありますか?

54
hch

いいえ、そうではありませんが、プールをこれ以上使用しない場合は、おそらく良い考えです。

pool.closeまたはpool.joinを呼び出す理由は、Tim Petersによって this SO post でよく言われています。

Pool.close()については、Poolインスタンスにこれ以上の作業を送信することは決してありません。したがって、Pool.close()は通常、メインプログラムの並列化可能な部分が終了したときに呼び出されます。その後、割り当てられたすべての作業が完了すると、ワーカープロセスが終了します。

Pool.join()を呼び出して、ワーカープロセスが終了するのを待つことも優れた方法です。他の理由の中でも、多くの場合、並列化されたコードで例外を報告する良い方法はありません(例外は、メインプログラムの実行内容にわずかに関連するコンテキストでのみ発生します)。Pool.join()は、発生したいくつかの例外を報告できる同期ポイントを提供します他の方法では表示されないワーカープロセスで。

71
Bamcclur