Пример 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