spawn
利用上一篇提到的 spawn 跟 send,可以做以下這個簡單的範例,我們用Test.sum運行了一個行程,其中receive可以接收其他行程傳來的訊息,利用尾遞迴的特性,直接不斷呼叫 sum ,便可以一直進行監聽,且不會造成記憶體爆炸。
用 pid 記錄了行程的 id,再用 send 函式來傳遞訊息給行程,這樣便完成了最簡單的行程間的溝通了。
iex> defmodule Test do
...> def sum do
...> receive do
...> [a, b] -> IO.inspect(a + b)
...> end
...> sum
...> end
...> end
{:module, Test,
<<70, 79, 82, 49, 0, 0, 4, 228, 66, 69, 65, 77, 65, 116, 85, 56, 0, 0, 0, 142,
0, 0, 0, 16, 11, 69, 108, 105, 120, 105, 114, 46, 84, 101, 115, 116, 8, 95,
95, 105, 110, 102, 111, 95, 95, 7, 99, ...>>, {:sum, 0}}
iex> pid = spawn(Test, :sum, [])
#PID<0.417.0>
iex> send pid, [3, 6]
9
[3, 6]
在 Elixir 中,最為人所知的應該是她在並行化處理方面的優化了,因此使用Process進行平行處理,在許多高處理量跟高延遲的工作下,應該可以取得不錯的效果吧,因為 Elixir 的 Process 不會造成堵塞,意味著就算某個行程卡住或爆掉,其他行程也不會受到影響。
spawn_link
當我們希望知道 Process 程序崩潰時,可以使用 spawn_link 這個函式,來與子程序做連結(意思是可以接收到子行程的崩潰訊息。)