从Elixir中的另一个进程获取消息队列

时间:2018-03-23 10:58:34

标签: elixir message-queue

我试图将消息队列从一个进程转移到另一个进程。它的工作方式如下:第一个进程(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

1 个答案:

答案 0 :(得分:0)

通过正常的消息传递完成向GenServer发送呼叫或强制转换。因此,您对流程收件箱的调用将在流程收件箱中排队。由于队列的FIFO特性,只有在处理队列中的所有其他消息后才会处理您的强制转换。因此,您只能看到在调用强制转换后排队的消息。