Splitter.isParallel返回false? (版本2.10.2)

时间:2013-08-16 01:23:12

标签: scala scala-collections

我有代码监视foreach方法的进度但需要能够检测foreach循环是否会并行发生以选择适当的进度跟踪算法。花时间追踪错误并将其隔离到:

scala> Vector(1,2,3).iterator.isParallel
res11: Boolean = false
scala> Vector(1,2,3).isParallel
res12: Boolean = false
scala> Vector(1,2,3).par.isParallel
res13: Boolean = true
...

scala> Vector(1,2,3).par.splitter.isParallel
res13: Boolean = false
scala> Vector(1,2,3).par.iterator.isParallel
res14: Boolean = false

这是一个错误还是我误解了这个功能?

1 个答案:

答案 0 :(得分:2)

在TraversableOps类中定义了isParallel方法,您可以通过隐式转换从各种集合类中获取该方法。相关的源代码段(来自scala / collection / parallel / package.scala)是:

implicit def traversable2ops[T](t: scala.collection.GenTraversableOnce[T]) = new TraversableOps[T] {
  def isParallel = t.isInstanceOf[Parallel]
  ...
}

从中可以看出,类需要扩展Parallel标记特征以从此方法返回true。事实证明,各种并行化的集合都是这样做的,但它们的迭代器却没有。也就是说,似乎Parallel仅用于标记实际的集合,而不是它们的帮助程序。我不知道这是否符合预期,或者是否可以被认为是一种疏忽。