Understanding Elixir Agent
This and the other “Deck” posts are a repurposing of flashcard study decks to Q&A blog posts.
What is an Elixir Agent?
They are a means of spawning an Elixir Process but with added the intention of keeping track of state.When should you used an Agent vs GenServer?
This is a matter of the developers personal preference. `Agent` requires less code to write, but is slightly less efficient than a GenServer.Agents are said to separate the client and server API's, explain this through an example Server:
# Compute in the agent/server
def get_something(agent) do
Agent.get(agent, fn state -> do_something_expensive(state) end)
end
# Compute in the agent/client
def get_something(agent) do
Agent.get(agent, & &1) |> do_something_expensive()
end
In the first get_something
function above the agent process is calling the do_something_expensive/1
function. In the second get_something
function it is client process (the process that called get_something/1
) that computes do_something_expensive/1
. In the case of a long running process it is generally preferred to handle the expensive function in the client so the Agent
is not blocked. If the function were do_something_inexpensive
where the process would not be blocked by heavy compute, then it could make more sense to handle it within the agent process. Code example from https://hexdocs.pm/elixir/1.12/Agent.html