我需要在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
答案 0 :(得分:4)
GenServer
不是一个从空中产生资源的魔法锅。这是一个单一的Erlang进程。 内部没有并发性。对handle_info
的后续调用,即使它是异步的,也只有在第一次调用返回后才会进入进程'邮箱 。关于如何组织Erlang进程邮箱的Here is a good reference。
那就是说,所有的电话都是:
send(self(), {:info_link, info})
在当前handle_info
返回后,被放入进程'邮箱中进行处理。
要实现您需要的功能,应该将代码分成两个不同的进程,例如:分为两个不同的GenServer
s。