このコードはすぐに戻ります:
user=> (dorun (pmap + [1 2] [3 4]))
nil
ただし、lein を使用して main メソッドで同じコードを実行すると、次のようになります。
(ns practice.core)
(defn -main [& args]
(dorun (pmap + [1 2] [3 4])))
なぜそれは決して返らないのですか?
興味深いことに、 で置き換えるpmap
とmap
、正常に戻ります。
shutdown-agents
メソッドの最後に呼び出す必要があります-main
。
(defn -main [& args]
(dorun (pmap + [1 2] [3 4]))
(shutdown-agents))
これはhttp://clojure.org/agentsで言及されています:
エージェントを使用すると、デーモン以外のバックグラウンド スレッドのプールが開始され、JVM のシャットダウンが防止されることに注意してください。shutdown-agents を使用してこれらのスレッドを終了し、シャットダウンを許可します。
pmap
エージェント スレッド プールで実行される futures を使用します。