首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >pmap和线程计数

pmap和线程计数
EN

Stack Overflow用户
提问于 2012-01-30 22:12:41
回答 1查看 1.1K关注 0票数 4
代码语言:javascript
复制
user=> (.. Runtime getRuntime availableProcessors)
2

评估这个例子:http://clojuredocs.org/clojure_core/clojure.core/pmap#example_684我得到了

代码语言:javascript
复制
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秒内执行。为什么会有所不同?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-01-30 22:35:32

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

  1. future使用没有大小的缓存线程池limit;
  2. map生成分块序列,即每次强制32个元素,即使实际上调用者只消耗了块开头的一小部分。

最终的结果是,pmap中的期货以32个模块并行推出。

注意,这并没有违反pmap的文档字符串中指定的约定。另一方面,代码可能会让人相信,它的意图是遵守“处理器+ 2”的限制--如果map编写得很天真,就会这样。实际上,pmap很可能早于转向分块序列,尽管我不太确定,这已经有一段时间了。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9065148

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档