2012-01-01 21 views
14

Clojureプログラムは、main関数の最後のステートメントを終了するとすぐに終了しません。最後のステートメントを終了するとClojureプログラムは終了しませんか?

私がしたのは、(doall (map ...))(doall (pmap ...))に変更することでした。終了する前に、タスクが完了すると突然プログラムがハングして終了しました。私は(println "Finished everything!")-main関数の最後の行に置き、それを出力しますが、しばらくの間は終了しません。何がこの動作を引き起こし、どのように修正する必要がありますか?

編集:pmapは、並列化されたプログラムの唯一の部分です(主に他のすべてが瞬間的に実行されるため)。プログラムの後半部分は正しく機能するためにはpmapのすべての結果が必要で、プログラムの出力はmapとpmapの両方で同じであるため、プログラムの最後にpmapが実行されているかどうかは疑いの余地があります。 printlnではなく末尾に(System/exit 0)を置いても、プログラムの出力は変わりません。 docsによれば

+1

私はそれが発火コードの後に​​するときPMAPは完全にその処理をやってはいけないことを推測すると思います。もっとコードを表示せずに伝えるのは難しいです。 –

+1

私は計算を実行した後にClojureがなぜハングしますか?(http://stackoverflow.com/questions/2622750/why-does-clojure-hang-after-performed-my-calculations) – amalloy

答えて

15

pmapは、スレッドプールから複数のスレッドをスピンアップして、並行タスクを処理します。

エージェントスレッドプール内のスレッドがデーモンスレッドではないため、JVMを正常に終了させるには、shutdown-agentを呼び出す必要があります。

正常にシャットダウンするように明示的に指示する必要があります(ただし、プログラムが終了したときのみ)。これはhereの前に回答されているようです。その答えから引用

:「あなたはPMAPによって使用されるスレッドプールをバックアップスレッドを殺すためにshutdown-agentsを呼び出す必要がある」

ドキュメントはここにある:http://clojuredocs.org/clojure_core/1.3.0/clojure.core/shutdown-agents

+0

すばらしい解決策!私は他のコマンドを実行するためにシェルを外し、 '(shutdown-agents)'を追加することで、この問題を複数のプロジェクトで実行しました。おそらく 'clojure.java.shell'は何か他のスレッドを使ってそのことを行っています。 –

4

... Fの時間 が配位オーバーヘッドを支配計算集約関数のNLY有用[PMAPはOです]。

だから、これはおそらくmapを使用するよりも、あなたのシナリオのpmapを使用して、よりオーバーヘッドがあることを意味します。 pmap以降のコードが実行される前に、pmapの処理に少し時間がかかっている可能性があります。

+0

心が落ちていますが、少なくとも説明をしてください。 –

+0

答えてくれてありがとうJason、しかし、私は質問に追加した理由でpmapがその操作を完了していないとは思っていません。この行動に他のアイデアはありますか?また、ちょうどfyi、私はあなたをdownvoteしなかった。 – wrongusername

+0

@wrongusername:他に提案はありません。スコット・ロウが提供した答えのおかげで、見た目は必要ありません。 –

関連する問題