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