我试图将消息队列从一个进程转移到另一个进程。它的工作方式如下:第一个进程(GenServer)启动,它按请求启动第二个进程。然后我在第一个进程中进行强制转换,这个强制转换会调用第二个进程。在调用第二个进程之前,我试图获取它的消息队列,并且总是得到一个空的。
defmodule First do
use GenServer
def start_link() do
GenServer.start_link(__MODULE__, %{}, name: __MODULE__)
end
def init(state) do
{:ok, Map.put(state, :process_list, [])}
end
def handle_call({:start_second, name}, _from, state) do
process_list = Map.get(state, :process_list)
{:ok, pid} = SecondProcess.start(name)
{:ok, Map.put(state, :process_list, [{name, pid}|process_list])}
{:reply, reply, state1}
end
def handle_call(_msg, _from, state) do
{:reply, :ok, state}
end
def handle_cast({:test, name}, state) do
process_list = Map.get(state, :process_list)
{_, pid} = List.keyfind(process_list, name, 0)
:erlang.process_info(pid, :messages) |> IO.inspect
SecondProcess.test(pid)
IO.puts("TEST FINISHED")
{:noreply, state}
end
def handle_cast(_msg, state) do
{:noreply, state}
end
def start_second_process(name) do
GenServer.call(__MODULE__, {:start_second, name})
end
def test(user_name) do
GenServer.cast(__MODULE__, {:test, user_name})
IO.puts("TEST STARTED")
end
端
答案 0 :(得分:0)
通过正常的消息传递完成向GenServer发送呼叫或强制转换。因此,您对流程收件箱的调用将在流程收件箱中排队。由于队列的FIFO特性,只有在处理队列中的所有其他消息后才会处理您的强制转换。因此,您只能看到在调用强制转换后排队的消息。