Einen Prozess zu erzeugen ist einfach, aber seinen Zustand und sein Verhalten zu verwalten, kann sehr kompliziert werden. Das Modul Agent ist eine Abstraktion, die den Umgang mit einem gemeinsamen Zustand in einem Elixir-Prozess erleichtert.
Wenn du Funktionen des Agent-Moduls verwendest, ist es üblich, die Agent-bezogenen Funktionen in einem einzigen Modul zu kapseln.
# 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
Ob du das Agent-Modul verwendest oder überhaupt mehrere Prozesse einsetzt, hängt davon ab, welche Beziehung zwischen den Daten du abbilden willst. Agent-Prozesse sind nützlich, wenn mehrere Prozesse einen gemeinsamen Zustand verwenden müssen.
Oft ist es die bessere Wahl, auf einen separaten Prozess zu verzichten und den Zustand stattdessen in einer Variablen innerhalb einer Funktion zu halten. Du solltest sie aber auch nicht blind wie eine globale Variable behandeln, denn andere Prozesse können sie verändern und dadurch Race Conditions oder nicht nachvollziehbare Fehler verursachen.
Wenn du dich für einen Agent-Prozess entscheidest, sollte das Ziel sein, einen einfachen Zustand zu halten und die Aufrufe an den Agent-Prozess in einem Modul zu kapseln, um die Aufrufe zu organisieren.
Wenn eine teure Aufgabe in einem anderen Prozess erledigt werden soll, solltest du einen Task-Prozess (mit Task) in Betracht ziehen. Wenn feststeht, dass ein Prozess einen Zustand halten und Verhalten ausführen soll, solltest du einen GenServer-Prozess (mit GenServer) in Betracht ziehen.