6

我有一个大型处理任务,我认为通过并发性和并行性提高效率已经成熟。

我查看了 GPars 文档,发现它们很混乱,所以我希望这里的人们可以提供帮助。

我想并行执行的第一个任务目前看起来像这样:

def providerOneProgrammes = providerOneProgrammeService.getProgrammes(timeWindow)
def providerTwoProgrammes = providerTwoProgrammeService.getProgrammes(timeWindow)

两者都返回一个对象列表,并且都可以并行运行。

我想一起执行它们,然后在处理返回列表之前等待它们完成(然后我将在列表之间查找匹配项,但我稍后会谈到)。

谢谢

拉克什

4

1 回答 1

14

在这里利用 GPar 的最简单方法是使用callAsync. 这是一个简单的例子:

@Grab(group='org.codehaus.gpars', module='gpars', version='1.0-beta-2')

import groovyx.gpars.GParsPool

def providerOneProgrammeService(timeWindow) {
    println "p1 starts"
    Thread.sleep(4000)
    println "p1 still going"
    Thread.sleep(4000)
    println "p1 ends"
    return "p1 return value"
}

def providerTwoProgrammeService(timeWindow) {
    println "p2 starts"
    Thread.sleep(5000)
    println "p2 still going"
    Thread.sleep(5000)
    println "p2 still going"
    Thread.sleep(5000)
    println "p2 ends"
    return "p2 return value"
}

def results = []
GParsPool.withPool {
    results << this.&providerOneProgrammeService.callAsync("arg1")
    results << this.&providerTwoProgrammeService.callAsync("arg2")
}
println "done ${results*.get()}"
于 2012-07-17T22:29:37.430 回答