[elixir! #0010] 漫话elixir源码之Task

什么是Task?

Task是指一些用来执行单一任务的进程, 它们一般不多和其它进程交流.并发

Task的做用是什么?

Task最主要的做用就是, 将顺序代码转换为并发代码. 在并发代码中, 咱们不须要等前一步执行完毕, 就能够同时开始执行下一步; 最后收集一下各个Task的结果就好了.async

图片描述

一个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}

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

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

启动一个任务.spa

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

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

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

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

@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并结束任务, 而后回复一个消息.it

相关文章
相关标签/搜索