Elixir进程监控:: EXIT vs:DOWN

时间:2017-02-19 19:19:12

标签: elixir

我通常会看到流程监控的示例,其中处理受监控流程退出的代码如下:

handle_info({:DOWN, ref, :process, pid}, state)

但我也看到过他们匹配:EXIT而不是:DOWN消息的示例。

到目前为止,我只能在我自己的示例中触发:DOWN消息,其中包括标准Process.exitGenServer.stop消息,以及在受监视的进程中引发异常

我什么时候会收到:EXIT消息?

1 个答案:

答案 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}}