1

我有一些代码,例如:

val data = List(obj1, obj2, obj3, obj4, ...).par.map { ... }

ParVector 大约有 12 个元素。我注意到我所有的工作都是在主线程中完成的,所以我追踪了堆栈跟踪,发现在下面的行(在下面的链接中),ifParallel 是假的(来自 CanBuildFrom)。关于为什么它是错误的任何提示,以及我能做些什么来帮助它?

https://github.com/paulp/scala-full/blob/2.9.0.1/src/library/scala/collection/parallel/ParIterableLike.scala#L504

4

2 回答 2

0

我无法重现这个:

case class Obj(i: Int)
val list = List(1 to 12 map Obj: _*)
def f(o: Obj) = { println("f " + o); Obj(o.i + 1) }
val data = list.par.map(f)

印刷:

f Obj(1)
f Obj(2)
f Obj(3)
f Obj(4)
f Obj(5)
f Obj(6)
f Obj(7)
f Obj(8)
f Obj(10)
f Obj(11)
f Obj(12)
f Obj(9)
// data: ParVector(Obj(2), Obj(3), Obj(4), Obj(5), Obj(6), Obj(7), Obj(8), Obj(9),
// Obj(10), Obj(11), Obj(12), Obj(13))

请参阅scala:并行集合不起作用?对于类似的症状,并且添加一些人为延迟表明事情可能同时发生。

你怎么知道ifParallel是在走其他路线?我这样做:

scala> collection.parallel.ParSeq.canBuildFrom[Int].isParallel
res0: Boolean = true

另外, 的价值是Runtime.getRuntime.availableProcessors多少?

于 2011-09-27T02:08:16.677 回答
0

我使用的 scala 版本有错误。它已经被修复了。

于 2012-09-16T01:32:14.597 回答