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 に答える