Sebbene avviare un processo sia facile, gestirne lo stato e il comportamento può diventare molto complicato. Il modulo Agent è un'astrazione per facilitare la gestione di uno stato condiviso in un processo Elixir.
Quando si usano le funzioni del modulo Agent, è consuetudine incapsulare le funzioni relative all'Agent in un singolo modulo.
# 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
La scelta di usare il modulo Agent, o di usare più processi in generale, dipende dalla relazione che si vuole modellare con i dati. I processi Agent sono utili quando uno stato condiviso deve essere usato da più processi.
Spesso è meglio evitare di usare un processo separato e usare una variabile all'interno del processo per conservare lo stato in una funzione. Bisogna anche fare attenzione a non trattarli ciecamente come una variabile globale, poiché potrebbero essere manipolati da altri processi, creando condizioni di race, o errori non tracciabili.
Se si sceglie di usare un processo Agent, l'obiettivo dovrebbe essere quello di mantenere uno stato semplice, incapsulando le chiamate al processo Agent all'interno di un modulo per organizzare le chiamate.
Se un lavoro costoso dovesse essere svolto in un altro processo, si dovrebbe prendere in considerazione un processo Task (usando Task).
Se si determina che un processo dovrebbe mantenere stato e svolgere comportamenti, si dovrebbe prendere in considerazione un processo GenServer (usando GenServer).