2013-08-16 2 views
2

foreach 메서드의 진행 상황을 모니터링하지만 foreach 루프가 적절한 진행 추적 알고리즘을 선택하기 위해 동시에 발생하는지 여부를 감지 할 수 있어야합니다. 버그를 추적하여 다음과 같이 격리했습니다.Splitter.isParallel이 false를 반환합니까? (버전 2.10.2)

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 

버그입니까? 아니면이 기능을 잘못 이해합니까?

답변

2

isParallel 메서드는 TraversableOps 클래스에서 정의되며 암시 적 변환을 통해 다양한 컬렉션 클래스에서 가져옵니다. (스칼라/수집/병렬/package.scala로부터) 관련 소스 단편이다

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

바와 같이 이로부터 알 수있는

는 클래스는이 방법에서 true를 반환하는 Parallel 마커 특성을 확대 할 필요가있다. 결과적으로 다양한 병렬 처리 된 콜렉션이이를 수행하지만 반복자는 그렇지 않습니다. 즉, Parallel은 헬퍼가 아닌 실제 컬렉션을 표시하는 데 사용 된 것으로 보입니다. 나는 그것이 의도 한대로인지 또는 감독 될 것이라고 주장 될지 여부를 알지 못합니다.