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)