【发布时间】:2018-11-15 19:59:08
【问题描述】:
我遇到了Process.monitor/1 的问题。我最初的用例是监控 Phoenix Channel 并在它死后进行一些清理。但是,我没有设法在 Phoenix 中设置它,并决定使用纯 GenServer 对其进行测试。
所以,我有一个简单的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 进程,并在Server 进程终止时调用匹配:DOWN 的handle_info。如果我在iex 试试:
iex> {_, pid} = Temp.Server.start_link([])
{:ok, #PID<0.23068.3>}
iex> Process.exit(pid, :kill)
true
我希望从Monitor 模块调用handle_info 并记录“DOWN”,但这不会发生。我究竟做错了什么?我认为它不起作用,因为我从服务器进程 Temp.Monitor.monitor(self()) 调用监视,但我只是不知道我应该怎么做。
【问题讨论】: