[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

相關文章
相關標籤/搜索