可以将视图与并行集合一起使用吗?

时间:2011-12-12 06:04:25

标签: scala view parallel-collections

在集合映射中查找结果的习惯用法是这样的:

list.view.map(f).find(p)

其中listList[A]fA => BpB => Boolean

是否可以将view与并行集合一起使用?我问,因为我得到了一些非常奇怪的结果:

Welcome to Scala version 2.9.1.final (Java HotSpot(TM) 64-Bit Server VM, Java 1.7.0).
Type in expressions to have them evaluated.
Type :help for more information.

scala> val f : Int => Int = i => {println(i); i + 10}
f: Int => Int = <function1>

scala> val list = (1 to 10).toList
list: List[Int] = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

scala> list.par.view.map(f).find(_ > 5)
1
res0: Option[Int] = Some(11)

scala> list.par.view.map(f).find(_ > 5)
res1: Option[Int] = None

1 个答案:

答案 0 :(得分:1)

"A Generic Parallel Collection Framework",Martin Odersky等人的论文讨论了新的并行集合。第8页有一个“并行视图”部分,讨论了viewpar如何一起使用,以及它如何能够提供视图和并行计算的性能优势。

至于您的具体示例,这肯定是一个错误。 exists方法也会中断,并且在一个列表中打破它会破坏所有其他列表,因此我认为这可能会中途执行的操作(find和{{1一旦得到答案就可以停止)设法以某种方式破坏线程池。它可能与the bug with exceptions being thrown inside functions passed to parallel collections有关。如果是这样,应该在2.10中修复。