- In
GenServer
the “waiting loop” is the part responsible for calling the varioushandle_
callbacks, you don’t get to see the loop because it is part of the generic OTP behaviour. - In
Agent
the “waiting loop” waits for messages to arrive. Those messages contain the functions sent to it to update it’s internal state - the state that gets to be maintained as part of the recursive loop call.
So really you should be focusing on GenServer
as it is the natural progression from the recursive receive
loop.
As far as I can tell Agent
really isn’t about the notion of a process but it’s about about state management without autonomous access control modelled on how Clojure’s Agents manage shared state where it can only be accessed via special function calls.
GenServer
completely controls its internal state and the way it’s accessed through the handle_
callbacks. Agent
is completely at the mercy of the functions that are sent to it from other processes.
So as such GenServer
has a far greater autonomy over it’s internal state than an Agent
does.
So far I’ve tried implementing
X
as an Agent (I need to keep state (a stack of urls) on it) andYn
as GenServers.
I really don’t think Agent
is a suitable solution here. Sounds more like X should be a GenServer
while Yn could be Tasks (example). Tasks themselves aren’t based on GenServer
but are just some (very useful) convenience code around spawn
, link
, receive
.