Elixir流程监控::退出vs:关闭

Elixir流程监控::退出vs:关闭,elixir,Elixir,我通常会看到处理受监控流程出口的代码如下所示的流程监控示例: handle_info({:DOWN, ref, :process, pid}, state) 但我也看到过一些例子,它们匹配的是:EXIT,而不是:DOWN消息 到目前为止,在我自己的示例中,我只能触发:DOWN消息,其中包括标准的Process.exit和GenServer.stop消息,以及在监视的进程中引发异常 我什么时候会收到:EXIT消息?:EXIT被发送到另一个进程试图使用进程退出的进程。EXIT(原因不是:kill)

我通常会看到处理受监控流程出口的代码如下所示的流程监控示例:

handle_info({:DOWN, ref, :process, pid}, state)
但我也看到过一些例子,它们匹配的是
:EXIT
,而不是
:DOWN
消息

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


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

:EXIT
被发送到另一个进程试图使用
进程退出的进程。EXIT
(原因不是
:kill
),但该进程正在捕获退出<代码>:向下被发送到正在监视另一个进程的进程,并且被监视的进程因任何原因退出

以下是两者的一个示例:

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}}
{:child,{:EXIT,#PID,:normal}
{:parent,{:DOWN,#Reference,:process,#PID,:normal}