2017-02-19 32 views
1

我通常看到的過程監控的示例,其中用於處理監測進程退出的代碼如下:藥劑進程監視::EXIT VS:DOWN

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

但我也看到的例子在那裏它們被相匹配的:EXIT而不是:DOWN消息。

到目前爲止,我只能夠在我自己的例子,其中包括標準Process.exitGenServer.stop消息,以及提高在監控過程中的異常觸發:DOWN消息。

何時收到:EXIT消息?

回答

7

: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}}