代码之家  ›  专栏  ›  技术社区  ›  HelloWorld

Async Elixir vs Async Julia

  •  3
  • HelloWorld  · 技术社区  · 7 年前

    在elixir中,我可以像这样异步运行代码

    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
    

    如果我不需要任何结果,我可以这样做

    defmodule Async do
       def example do
           process_id = Task.start_link(fn ->
              #some code you want its result later
           end)
           #do some stuff
           :ok
        end
    end
    

    在茱莉亚·朗身上,上述的等同于什么?

    1 回复  |  直到 7 年前
        1
  •  2
  •   Nathan Ripert Guillaume Milan    7 年前

    如果你 不在乎结果 ,你可以使用 @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秒,因为 取来 等待任务完成后再回手。