Bár egy folyamat elindítása egyszerű, az állapotának és a viselkedésének a kezelése nagyon bonyolulttá válhat. Az Agent modul egy absztrakció, amely megkönnyíti a megosztott állapot kezelését egy Elixir-folyamatban.
Amikor az Agent modul függvényeit használod, szokás az Agent modulhoz kapcsolódó függvényeket egyetlen modulba zárni.
# 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
Hogy az Agent modult használod-e, vagy egyáltalán több folyamatot, az attól függ, milyen kapcsolatot szeretnél modellezni az adatokkal. Az Agent-folyamatok akkor hasznosak, ha egy megosztott állapotot több folyamatnak is használnia kell.
Gyakran jobb választás elkerülni a külön folyamatot, és az állapotot egy függvényen belüli változóban tárolni. Arra is ügyelj, hogy ne kezeld őket vakon globális változóként, mert más folyamatok is módosíthatják őket, ami versenyhelyzeteket vagy nyomon követhetetlen hibákat okozhat.
Ha mégis Agent-folyamat mellett döntesz, a cél az legyen, hogy egyszerű állapotot tarts benne, és az Agent-folyamathoz intézett hívásokat egyetlen modulba csomagold, hogy rendezettek maradjanak.
Ha egy költséges munkát másik folyamatban kell elvégezni, érdemes megfontolni egy Task-folyamat használatát (a Task modullal). Ha pedig úgy adódik, hogy egy folyamatnak állapotot kell tárolnia és viselkedést kell megvalósítania, érdemes megfontolni egy GenServer-folyamat használatát (a GenServer modullal).