Читая документацию как GenServer, так и Агент, я задался вопросом, какие варианты использования решает Agent, а GenServer не может? Итак, когда предпочесть AgentGenServer?
Я знаю, что функции, определенные в ваших собственных агентах, выполняются в самом процессе агента, так что это, безусловно, большая разница.





While reading the documentation of both GenServer and Agent I wondered what are the Use Cases the Agent solves that GenServer cannot?
Никакого GenServerне можем, потому что Agent реализован поверх GenServer (просто посмотрите на источник).
So, when to prefer Agent over GenServer?
Когда частного случая, реализованного Agent, достаточно. Например: никаких асинхронных ответов, никакого различия между вызовами и приведениями и т. д.
I know that functions defined in your own agents get executed on the agent process itself
Это не функции, «определенные в ваших собственных агентах», а те, которые передаются в качестве аргументов в Agent.get/update/и т. д.
Пример из документов:
# 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