iT邦幫忙

2024 iThome 鐵人賽

DAY 3
0

在 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 有尾遞迴優化


上一篇
02 Process
下一篇
04 Message 回覆
系列文
Elixir 多工 : Processes 與 OTP30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言