叉/加入计算

时间:2013-11-26 09:37:26

标签: groovy fork-join gpars

我有一个fork / join计算示例。有人可以告诉我一下它在这里是如何运作的吗?

def quicksortForkJoin(numbers) {
    withPool {
        runForkJoin(0, numbers) {index, list ->
            def groups = list.groupBy {it <=> list[list.size().intdiv(2)]}
            if ((list.size() < 2) || (groups.size() == 1)) {
                return [index: index, list: list.clone()]
            }
            (-1..1).each { forkOffChild(it, groups[it] ?: [])}
            return [index: index, list: childrenResults.sort {it.index}.sum {it.list}]
        }.list
    }
}

1 个答案:

答案 0 :(得分:3)

有什么好处吗?

def quicksortForkJoin(numbers) {

    // Create a pool of workers the default size
    withPool {

        // Run a fork with index 0 and the numbers
        runForkJoin(0, numbers) {index, list ->         // [1]

            // Split numbers into 3 groups:
            //    -1: those less than the "middle" number
            //     0: those equal to the "middle" number
            //     1: those greater than the "middle" number
            def groups = list.groupBy {it <=> list[list.size().intdiv(2)]}

            // If there are less than 2 numbers to sort, or all numbers are equal
            if ((list.size() < 2) || (groups.size() == 1)) {

                // return the index and a clone of the current list
                return [index: index, list: list.clone()]
            }

            // Otherwise, fork off a child process for each of the
            // groups above (less than, equal and greater than)
            // forkOffChild will not block, and will effectively go back
            // to line [1] with the new index and list
            (-1..1).each { forkOffChild(it, groups[it] ?: [])}

            // Block waiting for all 3 children to finish, then sort the
            // results so the indexes are [ -1, 0, 1 ] and then join the
            // lists of numbers back together 
            return [ index: index,
                     list: childrenResults.sort {it.index}.sum {it.list}]

            // when done, return the `list` property from the final map
        }.list
    }
}