【问题标题】:Why does lein run hang?为什么 lein run 挂起?
【发布时间】:2015-10-26 23:21:23
【问题描述】:

我从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)))

一切都非常简单。当我运行时,例如lein repl 中的(-main 5),它会按预期运行、打印和返回。但是,当我尝试使用 lein run 5 时,它会运行并打印但从不退出,所以我不得不使用 Ctrl+C 来恢复我的终端。

知道为什么会这样吗?

【问题讨论】:

    标签: clojure leiningen


    【解决方案1】:

    Clojure 有一个线程池,它会一直运行以供代理使用。因为这些线程还活着,JVM 不能告诉你程序已经完成。它只是坐在那里等待特工退出。您可以通过在程序末尾调用(shutdown-agents) 来完成它们,如here 所述。期货使用代理。

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

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

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

    【讨论】:

    • @Elogent - 您在使用 future 时调用了代理。
    • 感谢@Elogent,我将对其进行编辑以将其包含在答案中。
    猜你喜欢
    • 2023-04-08
    • 2012-06-08
    • 2016-06-06
    • 2013-07-09
    • 1970-01-01
    • 2018-10-12
    • 2016-03-25
    • 2017-08-18
    • 2022-09-14
    相关资源
    最近更新 更多