在 Processes 之間可以傳送 message 來互相溝通,要發送 message 時使用 send/2
函式,每個 process 會有一個先進先出的信箱且只能用 receive/1
來接收,範例如下
建立一個執行 receive 的 process 並把回傳的 pid 存在變數 target_pid
target_pid = spawn(fn ->
receive do
message ->
IO.puts "收到了: #{message}"
after
60_000 ->
IO.puts "1 分鐘了還沒收到"
end
end)
每次執行 receive 時,會拿該 process 最早收到的 message,如果信箱內還沒有 message 時,則會等到有 message 或是在 after 裡設定的 timeout 才會繼續執行下一段。
在執行上面這段建立了新的 process 後,該 process 就會開始執行 receive 並等待我們使用 send
給他新訊息
send(target_pid, "告訴你一個秘密")
每個 process 在執行完所有程式碼後就會自動把自己關掉,如果我們要建立一個會一直等著收 message 的 process 可以這麼做:
defmodule Server do
def run do
receive do
message ->
IO.puts "收到了: #{message}"
end
run() #在收到後,再執行自己一次,準備收下一個
end
end
用 spawn 執行,並 send 訊息看看:
iex(31)> server_pid = spawn(fn -> Server.run end)
#PID<0.142.0>
iex(32)> send(server_pid, "有收到嗎")
收到了: 有收到嗎
"有收到嗎"
iex(33)> send(server_pid, "第二封")
收到了: 第二封
"第二封"
備註:Elixir 有尾遞迴優化