【问题标题】:async Elixir vs async Julia异步 Elixir 与异步 Julia
【发布时间】:2018-09-25 12:01:07
【问题描述】:

在 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

Julia lang 中的上述等价物是什么?

【问题讨论】:

标签: asynchronous elixir julia


【解决方案1】:

如果你不关心结果,可以使用@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 等待任务完成后才交还手。

【讨论】:

  • @async 返回一个Task,也可以是fetched,比如a = @async (sleep(2); "result"); println(fetch(a))
  • 那是准确的,我没注意到,谢谢!我意识到我的async.example1()实际上是一项任务。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-12-06
  • 1970-01-01
  • 1970-01-01
  • 2015-02-23
  • 2012-11-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多