由jim.blomo发表的评论
当工作受到CPU约束时,不要启动超过CPU核心的线程。目前(1.4版)pmap使用无界的线程池,所以分块序列将创建比预期更多的线程。最轻微的改变是使用固定大小的线程池(例如ForkJoinPool)。pmap与core.reducers的区别在于它是惰性的。这意味着线程池的submit模式是一次一个,而不是递归的fork/join模式。权衡包括
即使是对分块序列也要强制预览
- 不改变threadPool
- 违反分块,可能是出于某种原因
转移到固定大小线程池
- 减少分块序列上CPU密集型函数的竞争
- 增加I/O密集型函数的总实现时间
使用ForkJoinPool代替newFixedThreadPool进行固定线程池
- 自动和动态并行化
- 复杂的设置(选择Java 6与7的实现,与core.reducers共享池)
我认为使用传统的固定大小线程池是正确的选择。大多数时候,所有的pmap结果都会实现,因此我认为没有必要严格限制预览大小。这也是map决策的原因。由于我们没有使用ForkJoin的主要优势(递归工作队列),我认为在clojure.core中设置它是不值得的。
我将使用Agent/pooledExecutor作为固定大小的线程。
如果我有遗漏或误解,请告知。