2013-05-13 6 views
7

Dieses Stück Code kehrt sofort zurück:Warum kehrt diese einfache Hauptmethode nie bei leiningen zurück?

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

Allerdings, wenn ich das gleiche Stück Code in main-Methode unter Verwendung von lein laufen:

(ns practice.core) 

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

warum zurückkommt es nie?

Interessanterweise, wenn ich pmap durch map ersetze, kehrt es normal zurück.

Antwort

9

Sie müssen shutdown-agents am Ende Ihrer -main Methode aufrufen.

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

Dies wird auf http://clojure.org/agents erwähnt:

Hinweis, dass die Verwendung von Agents startet einen Pool von nicht-Daemon Hintergrund-Threads , die Abschaltung der JVM zu verhindern. Verwenden Sie shutdown-agents zu beenden Sie diese Threads, und ermöglichen Sie Herunterfahren.

pmap verwendet Futures, die auf dem Agenten-Thread-Pool ausgeführt werden.