Task module
Task顾名思义就是执行某些后台任务使用的, Task的实现也是OTP Server,所以OTP的行为Task也是可以的,比如你可以
监控一个task到监控树里。Task最常用的场景就是做异步的计算
比如
task = Task.async(fn -> do_some_work() end)
res = do_some_other_work()
res + Task.await(task)
Task模块最常用的两个函数async
和await
-
async 开新进程去执行给定的函数, 新的进程被调用进程(caller process)监控,
有两种方式
- async(fun)
- async(mod, fun, args)
返回值结构
defstruct pid: nil, ref: nil
-
await 获取task的结果,当你想要获取task的结果时, 传给所需要结果的task的描述符(aysnc返回值)
使用Task计算fibonacci的示例
defmodule Fib do
def of(0), do: 0
def of(1), do: 1
def of(n), do: Fib.of(n-1) + Fib.of(n-2)
end
在iex测试
iex(2)> worker = Task.async(fn -> Fib.of(20) end)
%Task{pid: #PID<0.64.0>, ref: #Reference<0.0.0.134>}
iex(3)> result = Task.await(worker)
6765
iex(4)> result
6765
iex(5)> worker = Task.async(Fib, :of, [20])
%Task{pid: #PID<0.68.0>, ref: #Reference<0.0.0.144>}
iex(6)> result = Task.await(worker)
6765