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))

究竟是如何工作countchildrenResult
为什么将 a0作为参数传递给sum()

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 回答