Clojure是否在映射调用中使用多个线程?

Clojure是否在映射调用中使用多个线程?,clojure,Clojure,我试图探索一个CPU受限的算法在使用Clojure扩展到多个CPU时的行为。该算法以一个大的连续整数序列作为输入,将该序列划分为给定数量的子序列,然后使用map对每个子序列应用一个函数。map函数完成后,使用reduce收集结果 完整代码在上提供,但以下是示例: (map computation-function (partitioning-function number-of-partitions input)) 当我在一台有12个内核的机器上执行此代码时,我看到大多数内核都在使用,而我只希

我试图探索一个CPU受限的算法在使用Clojure扩展到多个CPU时的行为。该算法以一个大的连续整数序列作为输入,将该序列划分为给定数量的子序列,然后使用map对每个子序列应用一个函数。map函数完成后,使用reduce收集结果

完整代码在上提供,但以下是示例:

(map computation-function (partitioning-function number-of-partitions input))
当我在一台有12个内核的机器上执行此代码时,我看到大多数内核都在使用,而我只希望看到一个内核在使用

理想情况下,我希望使用pmap来使用给定数量的线程,但我无法使代码仅使用一个线程执行

那么Clojure是否将计算扩展到多个CPU?如果是这样,我能做些什么来控制这种行为吗?

我的理解是,pmap使用多个内核,而map只使用当前线程。如果两个函数都使用了所有可用的核心,那么在库中同时使用这两个函数就没有意义了

以下简单实验表明,pmap使用单独的线程,而map不使用:

(defn something-slow [x]
  (Thread/sleep 1000))

(map something-slow (range 5))
;; Takes 5 seconds
(pmap something-slow (range 5))
;; Takes 1 second
我注意到您的GitHub代码在示例中使用了pmap,该示例在main-中运行;如果改回map,并行性是否会保持?

我的理解是,pmap使用多个内核,而map只使用当前线程。如果两个函数都使用了所有可用的核心,那么在库中同时使用这两个函数就没有意义了

以下简单实验表明,pmap使用单独的线程,而map不使用:

(defn something-slow [x]
  (Thread/sleep 1000))

(map something-slow (range 5))
;; Takes 5 seconds
(pmap something-slow (range 5))
;; Takes 1 second

我注意到您的GitHub代码在示例中使用了pmap,该示例在main-中运行;如果更改回map并行性是否持续?

首先,添加println线程:.getName线程/currentThread以证明它实际上在多个线程中执行。感谢调试建议,我相信我现在已经找到了问题的原因。首先,添加println线程:.getName线程/currentThread,以证明它实际上在多个线程中执行。感谢您的调试建议,我相信我现在已经找到了问题的原因。是的,很抱歉,我应该在上面说得更清楚。虽然Github上的代码默认使用pmap,但我尝试同时使用map和pmap。在本例中,我删除了pmap代码进行测试,以确保我使用的是map!好吧,再看一下我的代码就证实了你的怀疑。我一定是在不知不觉中使用了pmap,因为代码现在的行为与您描述的一样。谢谢是的,对不起,我应该在上面说得更清楚。虽然Github上的代码默认使用pmap,但我尝试同时使用map和pmap。在本例中,我删除了pmap代码进行测试,以确保我使用的是map!好吧,再看一下我的代码就证实了你的怀疑。我一定是在不知不觉中使用了pmap,因为代码现在的行为与您描述的一样。谢谢