2

我有监控 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

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

4

1 回答 1

2

isParallel方法在 TraversableOps 类中定义,您可以通过隐式转换从各种集合类中获得该类。相关的源代码片段(来自 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只用于标记实际集合,而不是它们的助手。我不知道这是否符合预期,或者是否可以说是疏忽。

于 2013-08-16T01:47:26.310 回答