19

我一直在研究新的 Scala 2.9 并行集合,并希望放弃很多我粗鲁的业余版本的类似东西。特别是,我想用我自己的东西(例如,通过参与者在网络上分配任务评估的东西)替换默认实现基础的分叉连接池。我的理解是,这只是应用 Scala 的“可堆叠修改”范式的问题,但集合库足够吓人,我不确定哪些位需要修改!

一些具体的问题:

  1. 标准并行实现仅通过代码与分叉连接池交互是否正确ForkJoinTasks
  2. 我看到有一个替代特征,FutureThreadPoolTasks. 我将如何构建一个使用此特征而不是 的集合ForkJoinTasks
  3. 我可以写另一个替代方案(也许是一个相应的样板类,它混合AdaptiveWorkStealingTasks并以某种方式实例化使用这个新特性的集合实例?

(作为参考,上面提到的所有特征都在Tasks.scala中定义。)

特别是代码示例非常受欢迎!

4

2 回答 2

16

只是为了提供更多关于事物如何组合在一起的信息(我怀疑你已经知道了):fork-join 池是通过实现特征的parallel包对象的tasksupport值“插入”的scala.collection.parallel.TaskSupport

反过来,这继承自Tasks(您提到的)并定义了以下操作:

def execute[R, Tp](fjtask: Task[R, Tp]): () => R

def executeAndWaitResult[R, Tp](task: Task[R, Tp]): R

但是,对我来说,如何通过提供自己的实现来覆盖集合本身显式导入的行为并不是很明显。TaskSupport例如,在ParSeqLike第 47 行:

import tasksupport._

事实上,我什至会说看起来并行性是绝对不可覆盖的(除非我非常错误,尽管我经常如此)。

于 2011-05-18T10:27:55.937 回答
5

是描述如何TaskSupport在 Scala 2.10 中切换对象的文档。

于 2012-03-30T21:22:49.457 回答