iT邦幫忙

2024 iThome 鐵人賽

DAY 5
0

alive?

我們可以透過 Process.alive?/1 來得知目標 process 還在不在

先使用 spawn 產生一個會等待 60 秒的 process

pid = spawn(fn ->
  Process.sleep(60_000)
end)

在 60 內檢查看看

Process.alive?(pid)

會得到 true

如果在 60 秒外,該 process 已經執行完畢自動關閉則會得到 false

spawn_link

類似 spawn 但是產生的 process 會與製造的 process 相連,常常會使用 parent process 與 child process 來稱呼

spawn 裡 raise 一個錯誤

spawn(fn -> raise("爆炸") end)

在 iex 裡執行,我們會收到錯誤的通知

20:37:39.348 [error] Process #PID<0.113.0> raised an exception
** (RuntimeError) 爆炸

但如果使用 spawn_link/1

spawn_link(fn -> raise("爆炸") end)

除了該 process 錯誤結束外,執行的 iex 也會一起關掉且重啟。

接收連結的錯誤回報

在 process 可以使用 Process.flag(:trap_exit, true) 把 child process 的錯誤改成回報訊息

Process.flag(:trap_exit, true)
spawn_link(fn -> raise("爆炸") end)

receive do
  error -> IO.inspect error
end

這樣 parent process 就不會直接連動一起關閉,而是收到

{:DOWN, #Reference<0.3450016372.3631218689.42949>, :process, #PID<0.112.0>,
 {%RuntimeError{message: "爆炸"}, []}}

spawn_monitor

也可以選擇不連結,但是追蹤該 child process 的狀態,使用 spawn_monitor/1

spawn_monitor(fn -> raise("爆炸") end)

receive do
  error -> IO.inspect error
end

一樣可以得到錯誤回報

{:DOWN, #Reference<0.3450016372.3631218689.42777>, :process, #PID<0.110.0>,
 {%RuntimeError{message: "爆炸"}, []}}

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

尚未有邦友留言

立即登入留言