Julia 如何等待第一个任务完成

Julia 如何等待第一个任务完成,julia,Julia,如果计划了一组并发任务,如何等待第一个任务完成 是否存在类似于wait([t1,t2],在=:FIRST\u COMPLETED时返回) 我认为这样做是可行的: julia> function waitfirst(ts) c = Channel{Int}() for (i, t) in enumerate(ts) @async begin wait(t)

如果计划了一组并发任务,如何等待第一个任务完成

是否存在类似于
wait([t1,t2],在=:FIRST\u COMPLETED时返回)


我认为这样做是可行的:

julia> function waitfirst(ts)
           c = Channel{Int}()
           for (i, t) in enumerate(ts)
               @async begin
                   wait(t)
                   put!(c, i)
               end
           end
           r = take!(c)
           @info "Task $r won"
       end
waitfirst (generic function with 1 method)

julia> waitfirst([@async(task1()), @async(task2())])
[ Info: task1 time: 0.6723665203367726
[ Info: task2 time: 0.4815093245244271
[ Info: task 2 done
[ Info: Task 2 won

julia> [ Info: task 1 done
julia> 

julia> waitfirst([@async(task1()), @async(task2())])
[ Info: task1 time: 0.3452659680724035
[ Info: task2 time: 0.8576370382519976
[ Info: task 1 done
[ Info: Task 1 won

julia> [ Info: task 2 done
julia> 

您必须确保首先安排输入,否则它会死锁。

与通道类似,您也可以像这样使用
条件:

c = Condition()
t1 = @async (task1(); notify(c))
t2 = @async (task2(); notify(c))
wait(c)
@info "wake"

请注意,这只是计划主任务,而不是直接切换到它。i、 e.当
t1
完成时,主任务可能被唤醒,但
t2
首先得到调度,并在主任务实际继续之前执行一些计算繁重的工作(阻塞)。如果您想确保先运行主任务,您可以查看
yield

您可以同时对通道进行写入,然后对其进行阻塞读取。我也喜欢这种方法,但当封装到
等待(任务列表)
函数中时,它不起作用。当第一个任务完成
wait_for
返回并且
c
条件变量超出范围时:当下一个任务完成时,您会得到一个
UndefVarError:c not defined
异常。这很奇怪。它在
@async
定义的隐式闭包中被引用,不应该被垃圾收集。你说得对!没有理由出现
UndervarError
,这是我的错误代码。
c = Condition()
t1 = @async (task1(); notify(c))
t2 = @async (task2(); notify(c))
wait(c)
@info "wake"