gpt4 book ai didi

clojure - pmap 和线程数

转载 作者:行者123 更新时间:2023-12-03 23:56:49 30 4
gpt4 key购买 nike

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”限制。这是常规 map 方式的结果。和 future宏观工作:

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

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

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

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

    30 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com