2012-03-03 1 views
1

에는 스레드가 명시 적으로 동기화 될 result 필요한 않는 액세스하거나 processItem()result를 조작 가정 result 단지 배열 목록GPars with Groovy, collectParallel()과 명시 적 동기화가 필요한 경우는 언제입니까?

def result 
GParsPool.withPool(5){ 
    result = idList.collectParallel{processItem(it)} 
} 

경우 .... 그루비/Gpars에서 다음의 병렬 처리를 가정하고? 나는 반환되는 결과가 List 경우

def result = Collections.synchronizedList(new ArrayList()) 
GParsPool.withPool(5){ 
    result = idList.collectParallel{processItem(it)} 
} 

답변

3

내가 놀랄 것입니다 ...이 대신 일을해야하는지 알 필요가 있지만,이 댓글을 보면 : 이상

반복 해 제공된 컬렉션의 비동기 변형을 사용하여 각 컬렉션의 요소를 평가하는 collect() 메서드가있는 컬렉션/개체입니다. 이 메서드가 반환 된 후 모든 클로저가 완료되고 호출자가 안전하게 결과를 사용할 수 있습니다. 멀티 스레드 액세스로 인해 발생하는 경쟁 조건에서 제공된 폐쇄가 사용하는 공유 리소스를 보호하는 것이 중요합니다. 콜렉션의 요소 중 하나에서 클로저가 예외를 throw하면 예외가 다시 발생합니다. 여기

: 이 모든 작업이 완료 될 때 안전하게 동기화 한하지 않고, 그 결과를 사용할 수있는 표시 http://code.google.com/p/gparallelizer/source/browse/trunk/src/main/groovy/groovyx/gpars/Parallel.groovy?r=1138

.

+0

나는 그것을 읽었지만, 말했듯이'result'는 내 처리 함수에서 절대로 조작되지 않는다는 것을 확신하기를 바랬다. 고마워 – raffian