从for循环存储GenServer结果

时间:2018-01-12 03:48:18

标签: elixir phoenix-framework

我需要在for循环中存储GenServer Call的最后结果。 我无法弄清楚应该如何正确地完成这项工作。

def handle_info(:load_info, state) do
  infos = for info <- state.infos do
    {:ok, infos} = send(self(), {:info_link, info})
    infos
  end

  {:noreply, %{state | infos: infos}}
end

def handle_info({:info_link, info}, state) do    
  {:ok, pid} = Infos.Server.start_link({info})
  infos = Map.put(state.infos, info.name, info)

  {:reply, {:ok, state}, %{state | infos: infos}}
end

1 个答案:

答案 0 :(得分:4)

GenServer不是一个从空中产生资源的魔法锅。这是一个单一的Erlang进程。 内部没有并发性。对handle_info的后续调用,即使它是异步的,也只有在第一次调用返回后才会进入进程'邮箱 。关于如何组织Erlang进程邮箱的Here is a good reference

那就是说,所有的电话都是:

send(self(), {:info_link, info})
在当前handle_info返回后,

被放入进程'邮箱中进行处理

要实现您需要的功能,应该将代码分成两个不同的进程,例如:分为两个不同的GenServer s。