У меня проблема с Process.monitor/1
.Мой первоначальный вариант использования заключался в мониторинге канала Phoenix и выполнении некоторой очистки после его смерти.Однако мне не удалось настроить его в Фениксе, и я решил протестировать его на чистых GenServers.
Итак, у меня есть простой GenServer
, и я хочу отследить, когда он умрет:
defmodule Temp.Server do
use GenServer
def start_link(_), do: GenServer.start_link(__MODULE__, %{})
def init(args) do
Temp.Monitor.monitor(self())
{:ok, args}
end
end
И еще один GenServer, который отслеживает:
defmodule Temp.Monitor do
use GenServer
require Logger
def start_link(_) do
GenServer.start_link(__MODULE__, [], name: __MODULE__)
end
def monitor(pid) do
Process.monitor(pid)
end
def handle_info({:DOWN, ref, :process, _, _}, state) do
Logger.info("DOWN")
{:noreply, state}
end
end
Так что, если я правильно понимаю, Process.monitor
начнет мониторинг процесса Temp.Server
и должен вызвать handle_info
match :DOWN
когда Server
процесс умирает.Если я попробую это в iex
:
iex> {_, pid} = Temp.Server.start_link([])
{:ok, #PID<0.23068.3>}
iex> Process.exit(pid, :kill)
true
, я ожидаю, что handle_info
будет вызван из модуля Monitor
и войдет в систему "ВНИЗ", однако этого не произойдет.Что я делаю неправильно?Я предполагаю, что это не работает, потому что я вызываю монитор из процесса сервера Temp.Monitor.monitor(self())
, но я просто не могу понять, как еще мне это сделать.