Multithreading 如何在clojure中生成n个线程
我想知道如何在clojure中创建n个线程。有一个名为“estimate value”的函数,它可以估计值并返回结果。 现在我想使用pmap或pcall创建n个线程,每个线程可以计算一个估计值,然后组合n个结果并返回最终的估计值。 我的代码是Multithreading 如何在clojure中生成n个线程,multithreading,clojure,pmap,Multithreading,Clojure,Pmap,我想知道如何在clojure中创建n个线程。有一个名为“estimate value”的函数,它可以估计值并返回结果。 现在我想使用pmap或pcall创建n个线程,每个线程可以计算一个估计值,然后组合n个结果并返回最终的估计值。 我的代码是 (defn compute-value [n] (/ (apply + (pmap (estimate-value) (range n))) n)) 我确信函数估计值是正确的。但当我跑的时候,发现一个错误: user=> (compute-
(defn compute-value [n]
(/ (apply + (pmap (estimate-value) (range n))) n))
我确信函数估计值是正确的。但当我跑的时候,发现一个错误:
user=> (compute-value 3)
ClassCastException java.lang.Double cannot be cast to clojure.lang.IFn clojure.core/pmap/fn--6744/fn--6745 (core.clj:6729)
如何修复这个计算值函数?谢谢大家! 除了一个小问题之外,您的代码似乎很好
(pmap (estimate-value) (range n))
首先计算(估计值)
一次,我假设它返回一个双精度
,然后它尝试使用该双精度
作为pmap
的函数,这就是您看到的错误java.lang.double不能转换为clojure.lang.IFn
您只需将其包装到函数中,如下所示:
(pmap (fn[x](estimate-value)) (range n))
OP没有指定
估计值是否为纯值,但假设为纯值是否更有意义?在这种情况下,它不是(fn[x](估计值x))
还是仅仅估计值
?似乎估计值
取零参数,否则我们会看到一个算术异常
,而不是对IFn的转换。。但是,我同意您的看法,如果估计值
确实采用单个数值参数,那么简单的(pmap估计值(范围n))
会更简单。@Shlomi您的解释非常清楚,现在我知道问题出在哪里了。非常感谢你@什洛米啊,非常精明!感谢您的解释。请看一下pvalues