Groovy - 等待承诺列表

Groovy - Wait on list of promises

我的程序中有几个承诺,我需要在继续之前模拟地等待所有。对于 Grails,我找到了以下示例:

def p1 = task { 2 * 2 }
def p2 = task { 4 * 4 }
def p3 = task { 8 * 8 }
assert [4,16,64] == waitAll(p1, p2, p3)

我知道 Grails 严重依赖 GPars, but I cannot find the reference to waitAll anywhere in there. Grails also supports PromiseList,我在 GroovyGPars 中也找不到。谁能指出我正确的方向?

真相在源代码中。

import groovyx.gpars.dataflow.Dataflow

def <T> List<groovyx.gpars.dataflow.Promise<T>> toGparsPromises(List<Promise<T>> promises) {
    final List<groovyx.gpars.dataflow.Promise<T>> dataflowPromises = promises.collect() { it -> (groovyx.gpars.dataflow.Promise<T>)((GparsPromise<T>)it).internalPromise }
    dataflowPromises
}

private static Closure<List<?>> originalValuesClosure = { List<?> values -> values }

def <T> List<T> waitAll(List<Promise<T>> promises) {
    final groovyx.gpars.dataflow.Promise<List<T>> promise = (groovyx.gpars.dataflow.Promise<List<T>>)Dataflow.whenAllBound(toGparsPromises(promises), originalValuesClosure)
    return promise.get()
}

https://github.com/grails/grails-core/blob/master/grails-async/src/main/groovy/org/grails/async/factory/gpars/GparsPromiseFactory.groovy

waitAll 是来自 Promises class. It internally built on GPars whenAllBound 方法的 Grails 特定静态方法,您可以将其用于您的实现。

感谢 defectusFeras Odeh,我可以找到使用 whenAllBound 的正确方法。只是为了节省其他人一点时间,这是一个有效的代码示例:

import static groovyx.gpars.dataflow.Dataflow.task
import static groovyx.gpars.dataflow.Dataflow.whenAllBound;

def p1 = task { 2 * 2 }
def p2 = task { 4 * 4 }
def p3 = task { 8 * 8 }
def total = whenAllBound(p1, p2, p3, { List<?> values -> values })
assertTrue([4,16,64] == total.get())

whenAllBound 需要一个名为 的闭包,其中包含所有承诺的结果 。我只是收集它们并按原样 return 它们。此外,whenAllBound return 本身就是一个 promise,因此您需要对其调用 .get() 方法(参见断言语句)。