Пример вилки / соединения с GPars

Я нашел здесь пример fork / join в GPars: Fork / Присоединиться

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?
Почему 0 передается в качестве параметра sum()?


person Evgenij Reznik    schedule 27.01.2013    source источник


Ответы (1)


Я не очень хорошо знаком с GPars, но в предоставленной вами ссылке говорится, что это Divide-and-Conquer и немного поясняет, что подразумевается позже, объясняя, что forkOffChild() не ждет - вместо этого getChildrenResults() ждет.

Возможно, вам будет легче понять предоставленный альтернативный подход на той же странице, в котором используется более Java-стиль, если вы более знакомы с этим.

childrenResults вызывает вызов метода _4 _, это «соединение» в «Fork / Join», оно ожидает, пока все дочерние элементы закончатся, а затем возвращает список с их результатами (или повторно генерирует любое исключение, которое могут быть сгенерированы дочерними элементами).

0 - это просто начальное значение суммы. Если childrenResult пусто, то суммируется count:

groovy:000> [].sum(1)
===> 1
groovy:000> [1].sum(1)
===> 2
person Elias Dorneles    schedule 27.01.2013
comment
Действительно полезный ответ! Большое спасибо! - person Evgenij Reznik; 27.01.2013