Clojure pmap和线程数

Clojure pmap和线程数,clojure,Clojure,评估这个例子:我得到 我想知道为什么我必须通过33秒才能等待33秒。为了结果。pmap创建2个(可用处理器)+2个线程,是吗?我想当通过(范围5)时,它将在6秒内执行。为什么不同 实际上pmap不遵守“处理器+2”限制。这是常规映射和未来宏工作方式的结果: future使用无大小限制的缓存线程池 map生成一个分块序列,即每次强制执行32个元素,即使调用者实际上只使用了块开头的少数元素 最终结果是pmap中的期货以32个区块并行启动 请注意,这并不违反pmap的docstring中规定的合同。另

评估这个例子:我得到


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

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

  • future
    使用无大小限制的缓存线程池

  • map
    生成一个分块序列,即每次强制执行32个元素,即使调用者实际上只使用了块开头的少数元素

  • 最终结果是
    pmap
    中的期货以32个区块并行启动

    请注意,这并不违反
    pmap
    的docstring中规定的合同。另一方面,代码可能会让人相信“处理器+2”限制应该得到尊重——就像
    map
    编写得很幼稚一样。事实上,
    pmap
    可能早于迁移到分块seq的时间,虽然我不确定,但已经有一段时间了

    user=> (.. Runtime getRuntime availableProcessors)
    2
    
    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)