在Elixir中,我可以像这样异步运行代码
const list: number[] /* or Array<number> */ = []
for(let x = 0; x <= 10; x++) {
list.push(x)
}
并且,如果我不需要任何结果,我可以这样做
defmodule Async do
def example do
process_id = Task.async(fn ->
#some code you want its result later
end)
#do some stuff
async_result = Task.await(process_id)
end
end
Julia lang中的上述含义是什么?
答案 0 :(得分:2)
如果您不关心结果,则可以使用@async
:
function foo()
sleep(100)
sum(1:100)
end
julia> @async foo()
Task (runnable) @0x00007f983b9d5f90
julia>
在上面的示例中,您无需等待foo()
的执行即可获得终端的控制权
如果您想知道结果并保持异步行为,则可以一起使用Task
,schedule
和fetch
:
julia> a() = sum(1:10000)
a (generic function with 1 method)
julia> b = Task(a)
Task (runnable) @0x00007f983b9d5cf0
julia> schedule(b)
Task (done) @0x00007f983b9d5cf0
julia> fetch(b)
50005000
这是我用来说明不同行为的一小段代码:
module async
function example1()
a() = @async sleep(2)
b = Task(a)
schedule(b)
println(fetch(b))
sleep(4)
fetch(b)
end
function example2()
a() = sleep(2)
b = Task(a)
schedule(b)
fetch(b)
end
function example3()
a() = sum(1:10000)
b = Task(a)
schedule(b)
fetch(b)
end
end;
运行此代码时,我得到:
julia> async.example1()
Task (runnable) @0x00007f983b9d5510
Task (done) @0x00007f983b9d5510
julia> async.example2()
julia> async.example3()
50005000
async.example2()
不会返回任何结果,而是使终端机忙2秒钟左右,因为fetch
等待任务完成,然后再放回手。