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,我在 Groovy
或 GPars
中也找不到。谁能指出我正确的方向?
真相在源代码中。
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()
}
waitAll 是来自 Promises class. It internally built on GPars whenAllBound 方法的 Grails 特定静态方法,您可以将其用于您的实现。
感谢 defectus 和 Feras 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()
方法(参见断言语句)。
我的程序中有几个承诺,我需要在继续之前模拟地等待所有。对于 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,我在 Groovy
或 GPars
中也找不到。谁能指出我正确的方向?
真相在源代码中。
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()
}
waitAll 是来自 Promises class. It internally built on GPars whenAllBound 方法的 Grails 特定静态方法,您可以将其用于您的实现。
感谢 defectus 和 Feras 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()
方法(参见断言语句)。