我有代码监视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
这是一个错误还是我误解了这个功能?
答案 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
仅用于标记实际的集合,而不是它们的帮助程序。我不知道这是否符合预期,或者是否可以被认为是一种疏忽。