user=> (.. Runtime getRuntime availableProcessors)
2

并评估这个例子:http://clojuredocs.org/clojure_core/clojure.core/pmap#example_684 我得到
user=> (time (doall (map long-running-job (range 4))))
"Elapsed time: 12000.621 msecs"
(10 11 12 13)
user=> (time (doall (pmap long-running-job (range 5))))
"Elapsed time: 3000.454 msecs"
(10 11 12 13 14)
user=> (time (doall (pmap long-running-job (range 32))))
"Elapsed time: 3014.969 msecs"
(10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 3839 40 41)
user=> (time (doall (pmap long-running-job (range 33))))
"Elapsed time: 6001.526 msecs"
(10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42)

我想知道为什么我必须通过 33 才能等待 33 秒。结果。 pmap 创建 2 个(可用处理器)+ 2 个线程,是吗?我想当通过(范围 5)时,它将在 6 秒内执行。为什么不一样?

最佳答案

实际上 pmap 不遵守“处理器 + 2”限制。这是常规 mapfuture 宏工作方式的结果:

  • future 使用没有大小限制的缓存线程池;
  • map 产生一个分块序列,也就是说,一个总是一次强制 32 个元素的序列,即使调用者实际上只消耗了块开头的少数元素。

  • 最终结果是 pmap 中的 future 以 32 个块为单位并行启动。

    请注意,这并不违反 pmap 的文档字符串中指定的契约(Contract)。另一方面,该代码可能会让人相信它旨在遵守“处理器 + 2”限制——就像 map 天真地编写一样。事实上,pmap 很可能早于转向分块序列,虽然我不太确定,但已经有一段时间了。

    关于clojure - pmap 和线程数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9065148/

    10-10 19:34