我們可以透過 Process.alive?/1
來得知目標 process 還在不在
先使用 spawn
產生一個會等待 60 秒的 process
pid = spawn(fn ->
Process.sleep(60_000)
end)
在 60 內檢查看看
Process.alive?(pid)
會得到 true
如果在 60 秒外,該 process 已經執行完畢自動關閉則會得到 false
類似 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: "爆炸"}, []}}
也可以選擇不連結,但是追蹤該 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: "爆炸"}, []}}