【问题标题】:How do I replace the fork join pool for a Scala 2.9 parallel collection?如何替换 Scala 2.9 并行集合的分叉连接池?
【发布时间】:2011-05-18 02:51:22
【问题描述】:

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

一些具体问题:

  1. 标准并行实现通过ForkJoinTasks中的代码单独与fork join pool交互是否正确?
  2. 我发现有一个替代特征,FutureThreadPoolTasks。我将如何构建一个使用此特征而不是 ForkJoinTasks 的集合?
  3. 我可以再写一个替代方案(也许是一个相应的样板类,它混合在 AdaptiveWorkStealingTasks 中并以某种方式实例化使用这个新特性的集合实例?

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

特别欢迎代码示例!

【问题讨论】:

    标签: scala parallel-processing scala-2.9 parallel-collections


    【解决方案1】:

    只是为了提供一些关于事物如何组合在一起的更多信息(我怀疑您已经知道):fork-join 池通过实现 scala.collection.parallel.TaskSupportparallel 包对象的 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._
    

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

    【讨论】:

    • 已确认 - 在 2.9.0 版本中,它并不意味着可以覆盖,但正在考虑如何在未来的版本中允许这样做。
    • 感谢@oxbow_lakes。很好奇FutureThreadPoolTasks 好像是个孤儿。 @axel22,你能指出我讨论过的邮件列表(如果有的话)吗?
    • 使用反射改变这个值怎么样?
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2011-08-02
      • 2011-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-22
      • 2012-10-03
      • 1970-01-01
      相关资源
      最近更新 更多