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

Posted

技术标签:

【中文标题】视图可以与并行集合一起使用吗?【英文标题】:Can views be used with parallel collections? 【发布时间】:2011-12-12 06:04:24 【问题描述】:

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

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

【问题讨论】:

呃,不知道到底发生了什么,但正是 view 产生了奇怪的行为。在 2.8 下也是如此,甚至没有 par 对我来说看起来像一个错误,并且该行为仍然存在于主干上。 @Malvolio 这很奇怪;我在没有.par 的情况下尝试了它,它按我的预期工作(结果始终如一Some(11))。它也适用于 .par 而不是 .view,只是两者都没有。 view 和并行集合的概念有点……相反。 view 允许您懒惰地使用集合,而并行集合则意味着并行地消耗。你如何证明同时使用两者的合理性? @Dan 我明白你的意思,但是对于像find 这样的方法是有意义的。 ParSeqLike 中存在 view 方法返回 ParSeqView 表明库设计者认为 ParSeqView 是有用的。 【参考方案1】:

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

至于您的具体示例,这绝对是一个错误。 exists 方法也会中断,并且让它在一个列表上中断会破坏所有其他列表,所以我认为这是一个问题,可能在中途中止的操作(findexists 一旦有一个答案)设法以某种方式打破线程池。它可能与the bug with exceptions being thrown inside functions passed to parallel collections 有关。如果是这样,它应该在 2.10 中修复。

【讨论】:

感谢该论文的链接。您链接到的错误听起来不像这个错误,尽管如果这是原因,那么拥有最新 2.10 版本的人应该能够验证。为了确保,我刚刚开了一个新的:issues.scala-lang.org/browse/SI-5525

以上是关于视图可以与并行集合一起使用吗?的主要内容,如果未能解决你的问题,请参考以下文章

使用并行线程填充集合有啥危险吗?

如何在 iOS 中将集合与 pageviewcontroller 一起使用

一起Talk Android吧(第四百七十九回:集合类视图动画)

一起Talk Android吧(第四百七十九回:集合类视图动画)

集合视图:可以手动触发 cellForItemAtIndexPath 吗?

从集合视图执行 segue