Защо този прост основен метод никога не се връща, когато се изпълнява от 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