Пример Fork/Join с GPars

Я нашел пример для fork/join в GPars здесь: 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?
Почему 0 передается в качестве параметра sum()?

1 ответ

Решение

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

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

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

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

groovy:000> [].sum(1)
===> 1
groovy:000> [1].sum(1)
===> 2
Другие вопросы по тегам