Es ist ein Mittel, artige Umsetzung von der offiziellen Elixir FührungsWie wartet der Elternprozess von GenServer auf seine Antwort?
defmodule AAgent do
def start_agent do
spawn_link fn -> loop(%{}) end
end
def loop(state \\ %{}) do
receive do
{:put, key, value, caller} ->
new_state = Map.put(state, key, value)
send caller, new_state
loop(new_state)
{:get, key, caller} ->
send caller, Map.get(state, key)
loop(state)
end
end
end
Wenn es verwendet wird, die Antwort auf seine Anrufer Prozess Mailbox geleitet wird
a = AAgent.start_agent
send a, {:put, :a, 42, self()}
flush
%{a: 42}
Wenn jedoch ein tatsächliches Mittel verwendet wird (die intern verwendet GenServer
), die als Reaktion auf den übergeordneten Prozess zur Verfügung steht sofort
iex> Agent.get(agent, fn list -> list end)
["eggs"]
ich nicht ne ed, um einen receive
Block zu schreiben, um ["eggs"]
zu erhalten, wenn ich Agent verwende, das Ergebnis bereits verfügbar, obwohl es ein separater Prozess ist, der Daten an einen anderen Prozess weitergab. Ist es möglich, den gleichen Effekt mit blanken Prozessen zu erreichen, oder nutzt GenServer
etwas anderes unter der Haube?