为什么lein会挂起来?

时间:2015-10-26 23:21:24

标签: clojure leiningen

我从here为练习2创建了一个Leiningen项目。我的代码如下所示:

(ns random-quotes.core
  (:require [clojure.string :as str])
  (:gen-class))

(defn word-count [s]
  (frequencies (str/split (first (str/split s #"\n")) #"\s")))

(def quote-url "http://www.braveclojure.com/random-quote")

(def total-word-count (atom {}))

(defn update-word-count []
  (future
    (swap! total-word-count
           (partial merge-with +)
           (word-count (slurp quote-url)))))

(defn quote-word-count [n]
  (doseq [quote-future (doall (repeatedly n update-word-count))]
    @quote-future)
  @total-word-count)

(defn -main [n]
  (doseq [entry (sort-by val (quote-word-count (bigdec n)))]
    (println entry)))

一切都很简单。当我在(-main 5)中运行时,例如lein repl,它会按预期运行,打印和返回。但是,当我尝试lein run 5时,它会运行并打印,但永远不会退出,因此我不得不使用 Ctrl + C 来恢复终端。< / p>

知道为什么会这样吗?

1 个答案:

答案 0 :(得分:3)

Clojure有一个线程池,它一直在运行以供代理使用。因为这些线程仍处于活动状态,所以JVM无法判断您是否已完成程序。只是坐在那里等待代理退出。您可以按照here所述,在程序结束时调用(shutdown-agents)来完成这些操作。期货使用代理商。

clojure.core/future-call调用这样的代理:

(let [f (binding-conveyor-fn f)
      fut (.submit clojure.lang.Agent/soloExecutor ^Callable f)]

实际上启动了代码运行。你不会是唯一一个发出some criticism声音的人,我们都希望找到更优雅的解决方案。