我从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>
知道为什么会这样吗?
答案 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声音的人,我们都希望找到更优雅的解决方案。