3

ここで GPars の fork/join の例を見つけました: Fork/Join

import static groovyx.gpars.GParsPool.runForkJoin
import static groovyx.gpars.GParsPool.withPool
withPool() {
    println """Number of files: ${
        runForkJoin(new File("./src")) {file ->
            long count = 0
            file.eachFile {
                if (it.isDirectory()) {
                    println "Forking a child task for $it"
                    forkOffChild(it)           //fork a child task
                } else {
                    count++
                }
            }
            return count + (childrenResults.sum(0))
            //use results of children tasks to calculate and store own result
        }
    }"""
}

動作し、正しい数のファイルを返しますが、残念ながら次の行がわかりません:

return count + (childrenResults.sum(0))

どのように正確に動作countし、childrenResult? にパラメーターとして渡されるの
はなぜですか?0sum()

4

1 に答える 1

3

私はGParsにあまり精通していませんが、あなたが提供したリンクは、それが分割統治アルゴリズムであり、後で暗黙のうちに何が暗黙的であるかをもう少し明確にし、forkOffChild()待機しないことを説明しています-代わりにgetChildrenResults()そうします。

同じページで提供されている代替アプローチを理解しやすい場合は、よりJava風のスタイルを使用します。

childrenResults結果としてメソッドが呼び出されますgetChildrenResults()。これは「Fork/Join」の「join」であり、すべての子が終了するのを待ってから、結果を含むリストを返します(または、子がスローした可能性のある例外を再スローします)。

0は合計の初期値にすぎません。空の場合childrenResult、それが合計されcountます:

groovy:000> [].sum(1)
===> 1
groovy:000> [1].sum(1)
===> 2
于 2013-01-27T11:30:14.377 に答える