异步Elixir和异步Julia

时间:2018-09-25 12:01:08

标签: asynchronous elixir julia

在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中的上述含义是什么?

1 个答案:

答案 0 :(得分:2)

如果您不关心结果,则可以使用@async

function foo()
    sleep(100)
    sum(1:100)
end

julia> @async foo()
Task (runnable) @0x00007f983b9d5f90

julia>

在上面的示例中,您无需等待foo()的执行即可获得终端的控制权

如果您想知道结果并保持异步行为,则可以一起使用Taskschedulefetch

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等待任务完成,然后再放回手。