2012-03-01 1 views
0

사용 GPars를 시작 각 스레드에 대한 인덱스를 필요, 나는 3 개 병렬로 몇 가지 작업을 수행하는 스레드 ...그루비 GPars는, 그루비와

GParsPool.withPool(3){ 
    result = myList.collectParallel{ 
     processItem(it) 
    } 
} 

이 잘 작동하지만 내가 폐쇄에 인덱스를 필요를 시작하는 실행 된 스레드 번호를 나타냅니다. 루프가 없기 때문에 이러한 인덱스에 액세스하는 방법을 모릅니다. 모든 것이 병행되고 있습니다.

나는 eachWithIndexParallel를 사용하여 시도,이,하지만 멋져요 (ArrayList를, 정수) 그루비에서

GParsPool.withPool(3) { 
    result = myList.eachWithIndexParallel{ i -> 
     processItem(it, i) 
    } 
} 

답변

2

eachWithIndex() 폐쇄에 두 개의 인수를 전달하기위한 이러한 방법의 불만을 더 결과를 반환 : GParsPool합니다. withPool () myList.eachWithIndexParallel {e, i -> processItem (e, i) } } 설명하는 이유는 무엇입니까?

그러나 각 스레드로부터 안전한 결과를 얻으려면 특별한주의를 기울여야합니다.

요소를 처리하는 스레드의 식별을 얻는 한 가지 방법은 클로저 내부의 Thread.currentThread() 메서드를 쿼리하는 것입니다.

+0

@Vaclac 어젯밤에 놀아 났고 당신 말이 맞아요. 'eachWithIndexParallel'은 결과를 수집하지 않습니다. 그래서 명시 적 동시 처리를 피하기 위해'collectParallel'을 고집합니다. 질문 : 어떻게 알았습니까? 'eachWithIndexParallel'에는 두 개의 인수가 필요합니까? 그 정보는 어디에서 찾을 수 있습니까? – raffian

+0

Groovy에서 이러한 메소드 (메소드에 전달 된 클로저의 예상되는 수 또는 유형)를 문서화하는 것은 일반적으로 어렵습니다. 이 경우, eachWithIndexParallel()은 Groovy의 원래 순차 eachWithIndex() 메소드의 계약을 따릅니다. –

+0

문서 : http://gpars.org/1.2.1/groovydoc/groovyx/gpars/Parallel.html#eachWithIndexParallel%28groovy.lang.Closure%29 – pyb