1

Groovy/Gpars で以下の並列処理を想定します....

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

は単なる配列リストであり、 でアクセスまたは操作するスレッドがないresultと仮定すると、明示的に同期する必要がありますか? 代わりにこれを行うべきかどうかを知る必要があります...resultprocessItem()result

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

1 に答える 1

3

返される結果が である場合は驚くでしょうがList、このコメントを見ると:

提供されたクロージャーの非同期バリアントを使用して、 collect()メソッドでコレクション/オブジェクトを反復処理し、各コレクションの要素を評価します。このメソッドが戻った後、すべてのクロージャーが終了し、呼び出し元は結果を安全に使用できます。提供されたクロージャによって使用される共有リソースを、マルチスレッド アクセスによって引き起こされる競合状態から保護することが重要です。コレクションの要素のいずれかによってクロージャが例外をスローする場合、その例外は再スローされます。

ここ: http://code.google.com/p/gparallelizer/source/browse/trunk/src/main/groovy/groovyx/gpars/Parallel.groovy?r=1138

すべてが完了したら、結果を同期することなく安全に使用できるようです。

于 2012-03-03T01:55:55.583 に答える