我通常会看到流程监控的示例,其中处理受监控流程退出的代码如下:
handle_info({:DOWN, ref, :process, pid}, state)
但我也看到过他们匹配:EXIT
而不是:DOWN
消息的示例。
到目前为止,我只能在我自己的示例中触发:DOWN
消息,其中包括标准Process.exit
和GenServer.stop
消息,以及在受监视的进程中引发异常
我什么时候会收到:EXIT
消息?
答案 0 :(得分:9)
:EXIT
被发送到另一个进程尝试使用Process.exit
退出的进程(除了:kill
以外的原因),但该进程正在捕获退出。 :DOWN
被发送到正在监视另一个进程的进程,并且受监视进程因任何原因退出。
这是两个例子:
pid = spawn(fn ->
Process.flag(:trap_exit, true)
receive do
x -> IO.inspect {:child, x}
end
end)
Process.monitor(pid)
Process.sleep(500)
Process.exit(pid, :normal)
Process.sleep(500)
# A process cannot trap `:kill`; it _has_ to exit.
Process.exit(pid, :kill)
receive do
x -> IO.inspect {:parent, x}
end
输出:
{:child, {:EXIT, #PID<0.70.0>, :normal}}
{:parent, {:DOWN, #Reference<0.0.8.223>, :process, #PID<0.73.0>, :normal}}