iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 28
1

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 這個函式,來與子程序做連結(意思是可以接收到子行程的崩潰訊息。)


上一篇
Day 27 |> Elixir 並行性 (一)
下一篇
Day 29 |> Elixir 並行性 (三)
系列文
用Elixir學習後端煉金術30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言