Asynchronous 等待多个异步GPAR数据流任务,超时

Asynchronous 等待多个异步GPAR数据流任务,超时,asynchronous,groovy,dataflow,gpars,Asynchronous,Groovy,Dataflow,Gpars,我正在努力实现一个目标,即拥有多个具有常规超时的异步任务。诀窍是我需要处理在超时时间内收到的任何内容 例如,下面的代码在超时值超过两秒时获取两个任务的值。但是,一旦超时时间减少(或者任务花费的时间更长),只会抛出TimeoutException,并且不会收到任何任务结果 def timeout = 3 // value in seconds def t1 = task { Thread.sleep(1000) println 't1 done' 't1' } def

我正在努力实现一个目标,即拥有多个具有常规超时的异步任务。诀窍是我需要处理在超时时间内收到的任何内容

例如,下面的代码在超时值超过两秒时获取两个任务的值。但是,一旦超时时间减少(或者任务花费的时间更长),只会抛出TimeoutException,并且不会收到任何任务结果

def timeout = 3  // value in seconds

def t1 = task {
    Thread.sleep(1000)
    println 't1 done'
    't1'
}

def t2 = task {
    Thread.sleep(2000)
    println 't2 done'
    't2'
}

def results = whenAllBound( [t1, t2] ) { List l ->
    println 'all done ' + l
    l.join(', ')
}.get( timeout, SECONDS )

println "results $results"
使用
join()
代替
get()

要么我没有完全/足够/正确地理解数据流结构,要么我试图错误地使用它们,要么两者都不正确


基本上,我需要的是一个同步块,它用一个公共超时触发多个异步作业,返回超时发生时可用的任何响应。超时更像是一种例外情况,但对于每项任务都会偶尔发生,并且不会影响整体处理。

也许这种方法对您有效:

whenAllBound( [t1, t2] ) { List l ->
    println 'all done ' + l
    l.join(', ')
}.join( timeout, java.util.concurrent.TimeUnit.SECONDS )

def results = [t1, t2].collect {it.bound ? it.get() : null}
println "results $results"

是的,这似乎正是我需要的。我几乎用Select、DataflowQueue和一个AtomicInteger完成了一个有效的解决方案,但这要干净得多。