Embora criar um processo seja fácil, gerir o seu estado e o seu comportamento pode tornar-se muito complicado. O módulo Agent é uma abstração que facilita a gestão de um estado partilhado num processo Elixir.
Quando usas as funções do módulo Agent, é habitual encapsular as funções relacionadas com o agente num único módulo.
# A simple use of agent processes to represent a counter
defmodule Counter do
def start_link(initial_value) do
Agent.start(fn -> initial_value end)
end
def value(pid) do
Agent.get(pid, & &1)
end
def increment(pid) do
Agent.update(pid, &(&1 + 1))
end
end
A escolha de usar o módulo Agent, ou de usar vários processos, depende da relação que queres modelar com os dados. Os processos de agente são úteis quando um estado partilhado tem de ser usado por vários processos.
Muitas vezes, é a melhor escolha evitar usar um processo separado e usar uma variável local ao processo para guardar o estado dentro de uma função. Também deves ter cuidado em não os tratar cegamente como uma variável global, pois podem ser manipulados por outros processos, criando condições de corrida ou erros impossíveis de rastrear.
Se optares por usar um processo de agente, o objetivo deve ser manter um estado simples, encapsulando num módulo as chamadas ao processo de agente, para as organizar.
Se houver um trabalho pesado que deva ser feito noutro processo, deves considerar um processo de tarefa (usando Task). Se concluíres que um processo deve guardar estado e executar comportamentos, deves considerar um processo GenServer (usando GenServer).