我努力实现拥有一般超时的多个异步任务的目标。诀窍是我需要处理超时内收到的任何内容。
例如,当超时值超过两秒时,下面的代码会获取两个任务的值。但是一旦超时减少(或者任务花费更长时间),只抛出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,但是它再次也不返回最终结果,并在超时到期后继续处理代码。
要么我完全/不够/正确地理解数据流结构,我试图错误地使用它们,或者两者兼而有之。
基本上我需要的是一个同步块,它会触发多个具有公共超时的异步作业,并返回超时发生时可用的响应。超时更像是一种特殊情况,但偶尔会发生在每个任务中,不应影响整体处理。
答案 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"