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


94

次のように '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.joinforループの後に呼び出す必要がありますか?


私は通常、すべてのプールスレッドを開始したpool.join()後に呼び出しpool.close()ますがpool.imap_unordered()、イテラブルとして使用したことはありません。
Bamcclur

8
joinまたはcloseを呼び出す意味は何ですか?私はそれらを呼び出さなかったし、私のコードは正常に動作しているようです。ただし、これらを呼び出さないとゾンビプロセスやその他の微妙な問題が発生するのではないかと心配しています。
2016

回答:


111

いいえ、使用しませんが、プールを使用しない場合は、おそらく良い考えです。

このSOの投稿でTim Petersが電話をかける理由、pool.closeまたはpool.joinよく言われる理由:

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

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


9
どちらを先に呼び出す方が良いですか?
RSHAP 2017

9
pool.close()最初とpool.join()2番目に電話をかけるのが好きなようです。これにより、pool.close()との間に作業を追加できpool.join()、プールの実行が完了するのを待つ必要がありません。
Bamcclur 2017

33
@Bamcclurのコメントに追加するだけです- pool.close()最初に呼び出すのは良い考えではなく、実際には必須です。ドキュメント:一つは、呼び出す必要がありますclose()またはterminate()使用する前にjoin()
Bogd

4
@Bogdしかし、なぜそれが必須なのですか?この質問に答えもらえますか?
agdhruv

agdhruvsの質問への答えは素晴らしいでしょう!
ホイップ

44

私が使用していないときにPythonのmultiprocessing.poolでメモリ使用量が増加し続けるのと同じメモリ問題がありましたpool.close()pool.join()とき、およびpool.map()レーベンシュタイン距離を計算する関数で使用しているありました。関数は正常に機能しましたが、Win7 64マシンではガベージコレクションが適切に行われず、オペレーティングシステム全体が停止するまで、関数が呼び出されるたびにメモリ使用量が制御不能になり続けました。リークを修正したコードは次のとおりです。

stringList = []
for possible_string in stringArray:
    stringList.append((searchString,possible_string))

pool = Pool(5)
results = pool.map(myLevenshteinFunction, stringList)
pool.close()
pool.join()

プールを閉じて参加した後、メモリリークはなくなりました。


1
ERROR: Terminated with signal 15クリーンアップコードを追加する前に取得していましたが、クリーンアップコードpool.close();pool.join();を追加した後、コンソールメッセージが表示されません。だから、少なくとも私のバージョン、C7のpython 2.7では、プールがおそらく正確にクリーンアップされていなかったのではないかと思います。
Trevor Boyd Smith、
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.