user=> (.. Runtime getRuntime availableProcessors)
2
并评估这个例子:http://clojuredocs.org/clojure_core/clojure.core/pmap#example_684 http://clojuredocs.org/clojure_core/clojure.core/pmap#example_684 I get
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 个元素,即使调用者实际上只消耗了块开头的少数元素。
最终的结果是,期货pmap
以 32 个为一组并行启动。
请注意,这并不违反中规定的合同pmap
的文档字符串。另一方面,该代码可能会让人相信“处理器 + 2”限制是被尊重的——就像如果map
写得很天真。实际上,pmap
很可能早于转向分块序列,虽然我不太确定,但已经有一段时间了。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)