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}