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秒内执行。为什么会有所不同?
发布于 2012-01-30 22:35:32
实际上,pmap并不遵守“处理器+ 2”的限制。这是常规map和future宏工作方式的结果:
future使用没有大小的缓存线程池limit;map生成分块序列,即每次强制32个元素,即使实际上调用者只消耗了块开头的一小部分。最终的结果是,pmap中的期货以32个模块并行推出。
注意,这并没有违反pmap的文档字符串中指定的约定。另一方面,代码可能会让人相信,它的意图是遵守“处理器+ 2”的限制--如果map编写得很天真,就会这样。实际上,pmap很可能早于转向分块序列,尽管我不太确定,这已经有一段时间了。
https://stackoverflow.com/questions/9065148
复制相似问题