Clojure Leiningen Uberjar与lein run的结果不同
我的应用程序在clojure repl或使用leiningen repl运行时运行,但当我使用uberjar创建一个jar并运行应用程序时,它只读取我收集的前2条记录 我追踪到了pmap,所以我创建了pmap的最简单的可能用法,它变得更加复杂。 为什么这样做有效Clojure Leiningen Uberjar与lein run的结果不同,clojure,leiningen,Clojure,Leiningen,我的应用程序在clojure repl或使用leiningen repl运行时运行,但当我使用uberjar创建一个jar并运行应用程序时,它只读取我收集的前2条记录 我追踪到了pmap,所以我创建了pmap的最简单的可能用法,它变得更加复杂。 为什么这样做有效 (ns ktest.core (:gen-class)) (defn -main [] (println (pmap identity (range 20)))) 但不是这个 (ns ktest.core
(ns ktest.core
(:gen-class))
(defn -main []
(println (pmap identity (range 20))))
但不是这个
(ns ktest.core
(:gen-class))
(defn -main []
(pmap #(println %) (range 20)))
你被“懒虫”咬了。pmap创建读取时将计算结果的序列。当您使用println
运行此命令时,它会读取结果,以便打印它们,从而触发评估。在这种情况下,您可以修复此问题,即doall
或dorun
。如果您只需要运行它的打印副作用,请选择dorun
,如果您需要使用此结果执行某些操作,请选择将结果保存在内存中的doall
(dorun (pmap #(println %) (range 20)))
有几项因为错误而被打印出来。有关的详细信息,请参阅本Jira版本。一般来说,我们不应该在pmap等功能中执行任何副作用操作,地图etc@Cubic:因为这些函数是基于FP概念的,因此你应该对你的风险做任何副作用,因为它可能会导致竞争条件之类的问题。我从pmap的副作用中看到的唯一不希望的结果是顺序不一致,一些线程可能会先完成。一般来说,最常见的副作用问题是在
ref
s和agent
s中使用时会出现多次副作用(有趣的是,在使用refs向代理发送任务时不会发生这种情况)。我不会轻视不一致顺序发生的事情的不良结果。99%的时候,这会让你很难受:-)我做一个pmap来并行检索一堆URL。。。lein run有效,uberjar无效。尝试了doall,但仍然不起作用。。。它甚至不适用于简单映射(当作为uberjar运行时)。