等待具有超时的多个异步gpars数据流任务

时间:2015-11-09 09:53:48

标签: asynchronous groovy dataflow gpars

我努力实现拥有一般超时的多个异步任务的目标。诀窍是我需要处理超时内收到的任何内容。

例如,当超时值超过两秒时,下面的代码会获取两个任务的值。但是一旦超时减少(或者任务花费更长时间),只抛出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"

而不是get()使用join()不会抛出TimeoutException,但是它再次也不返回最终结果,并在超时到期后继续处理代码。

要么我完全/不够/正确地理解数据流结构,我试图错误地使用它们,或者两者兼而有之。

基本上我需要的是一个同步块,它会触发多个具有公共超时的异步作业,并返回超时发生时可用的响应。超时更像是一种特殊情况,但偶尔会发生在每个任务中,不应影响整体处理。

1 个答案:

答案 0 :(得分:2)

也许这种方式适合你:

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"