【问题标题】:Leiningen Uberjar different results from lein runLeiningen Uberjar 与 lein run 的结果不同
【发布时间】:2012-10-07 03:40:45
【问题描述】:

当我在 clojure repl 或使用 leiningen repl 中运行我的应用程序时,它会运行,但是当我使用 uberjar 创建一个 jar 并运行该应用程序时,它只会读取我收藏的前 2 条记录。

我将其追踪到 pmap,因此我创建了 pmap 的最简单用法,它变得更加怪异。 为什么会这样

(ns ktest.core
    (:gen-class))
(defn -main []
  (println (pmap identity (range 20))))

但不是这个

(ns ktest.core
        (:gen-class))
    (defn -main []
       (pmap #(println %) (range 20)))

【问题讨论】:

    标签: clojure leiningen


    【解决方案1】:

    你被“懒虫”咬了。 pmap 创建读取时将计算结果的序列。当您使用println 运行它时,它会读取结果以便打印它们,从而触发评估。在这种情况下,您可以通过doalldorun 解决此问题。如果您只需要运行它的打印副作用,请选择dorun,如果您需要对此结果做一些事情,请选择doall,它将结果保存在内存中。

    (dorun (pmap #(println %) (range 20)))
    

    由于chunked sequences,打印了一些项目。有关pmap and chunked sequences 的详细信息,请参阅此 Jira 问题。

    【讨论】:

    • 一般来说,我们不应该在 pmap、map 等函数中做任何副作用操作
    • @Cubic:因为这些函数是基于 FP 概念的,因此您应该对风险采取任何副作用,因为它可能导致竞争条件类问题
    • 我从 pmap 的副作用中看到的唯一不良结果是顺序不一致,某些线程可能会先完成。一般来说,最常见的副作用问题是在 refs 和 agents 内使用时多次运行的副作用(有趣的是,使用 refs 向代理发送任务时不会发生这种情况)
    • 我不会轻视以不一致的顺序发生的事情的不良结果。 99% 的时间,这会让你很难受 :-)
    • 我做了一个 pmap 来并行检索一堆 URL... lein run 有效,uberjar 不行。尝试了 doall 但仍然无法正常工作......它甚至不适用于简单的地图(作为 uberjar 运行时)。
    猜你喜欢
    • 1970-01-01
    • 2016-06-06
    • 1970-01-01
    • 2016-07-22
    • 1970-01-01
    • 2016-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多