Multithreading 如何在clojure中生成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-

我想知道如何在clojure中创建n个线程。有一个名为“estimate value”的函数,它可以估计值并返回结果。 现在我想使用pmap或pcall创建n个线程,每个线程可以计算一个估计值,然后组合n个结果并返回最终的估计值。 我的代码是

(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