Clojure在地图调用中使用多个线程吗?

时间:2013-03-24 19:45:26

标签: clojure

我正在尝试探索CPU绑定算法的行为,因为它使用Clojure扩展到多个CPU。该算法将大量连续整数作为输入,将序列划分为给定数量的子序列,然后使用map将函数应用于每个子序列。地图功能完成后,使用reduce来收集结果。

Github上提供了完整的代码,但这里有一个示例:

(map computation-function (partitioning-function number-of-partitions input))

当我在具有12个内核的机器上执行此代码时,我看到大多数内核正在使用,当我希望只看到一个内核正在使用时。

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

Clojure是如何将计算分散到多个CPU的?如果是这样,我能做些什么来控制这种行为吗?

1 个答案:

答案 0 :(得分:4)

我的理解是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并行性仍然存在吗?