Почему этот простой основной метод никогда не возвращается при запуске leiningen?

Этот фрагмент кода возвращается немедленно:

user=> (dorun (pmap + [1 2] [3 4]))
nil

Однако, когда я запускаю тот же фрагмент кода в основном методе, используя lein:

(ns practice.core)

(defn -main [& args]
  (dorun (pmap + [1 2] [3 4])))

почему никогда не возвращается?

Интересно, если я заменю pmap на map, он вернется нормально.


person Community    schedule 13.05.2013    source источник


Ответы (1)


Вам нужно вызвать shutdown-agents в конце вашего метода -main.

(defn -main [& args]
  (dorun (pmap + [1 2] [3 4]))
  (shutdown-agents))

Это упоминается на http://clojure.org/agents:

Обратите внимание, что использование агентов запускает пул фоновых потоков, не являющихся демонами, которые предотвращают завершение работы JVM. Используйте агенты отключения, чтобы завершить эти потоки и разрешить завершение работы.

pmap использует фьючерсы, которые запускаются в пуле потоков агента.

person mtyaka    schedule 13.05.2013