1

什么是Task?

Task是指一些用来执行单一任务的进程, 它们通常很少和其它进程交流.

Task的作用是什么?

Task最主要的作用就是, 将顺序代码转换为并发代码. 在并发代码中, 我们不需要等前一步执行完毕, 就可以同时开始执行下一步; 最后收集一下各个Task的结果就行了.

图片描述

一个task的结构是什么样子?

 defstruct pid: nil, ref: nil, owner: nil

pid: 此task进程的pid.
ref: 此task的监视者.
owner: 此task的所有者.

Task模块里有哪些函数?

 @spec start_link(fun) :: {:ok, pid}
 @spec start_link(module, atom, [term]) :: {:ok, pid}

启动一个任务, 作为监督树的一部分.

 @spec start(fun) :: {:ok, pid}
 @spec start(module, atom, [term]) :: {:ok, pid}

启动一个任务.

 @spec async(fun) :: t
 @spec async(module, atom, [term]) :: t

启动一个任务, 它的返回值必须要在之后被收回(await).

 @spec await(t, timeout) :: term | no_return

等待一个任务的返回值. 超时了会报错.

 @spec yield(t, timeout) :: {:ok, term} | {:exit, term} | nil

等待一个任务的返回值. 超时不会报错.

 @spec yield_many([t], timeout) :: [{t, {:ok, term} | {:exit, term} | nil}]

在给定的时间内接受(yield)多个任务的返回值.

 @spec shutdown(t, timeout | :brutal_kill) :: {:ok, term} | {:exit, term} | nil

解除link并结束任务, 然后回复一个消息.


Ljzn
399 声望102 粉丝

网络安全;函数式编程;数字货币;人工智能