2017-02-19 2 views
1

я обычно вижу примеры мониторинга процесса, где код для обработки с контролируемого выхода процесса заключается в следующем:Elixir Процессы мониторинга:: EXIT против: DOWN

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

Но я также видел примеры, когда они Совмещение :EXIT вместо сообщения :DOWN.

До сих пор я только был в состоянии вызвать :DOWN сообщения в своих собственных примерах, который включает в себя стандартные Process.exit и GenServer.stop сообщений, а также повышение исключения в наблюдаемом процессе.

Когда я получу сообщение :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}} 
Смежные вопросы