Lancer un processus est facile, mais gérer son état et son comportement peut devenir très compliqué. Le module Agent est une abstraction qui facilite la gestion d'un état partagé dans un processus Elixir.
Quand on utilise les fonctions du module Agent, il est d'usage d'encapsuler les fonctions liées à l'agent dans un seul module.
# 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
Le choix d'utiliser le module Agent, ou même d'utiliser plusieurs processus, dépend de la relation que l'on souhaite modéliser avec les données. Les processus Agent sont utiles quand un état partagé doit être utilisé par plusieurs processus.
Il est souvent préférable d'éviter d'utiliser un processus séparé et de conserver l'état dans une variable locale à l'intérieur d'une fonction. Il faut aussi se garder de les traiter aveuglément comme une variable globale, car d'autres processus peuvent les manipuler, ce qui crée des conditions de concurrence ou des erreurs impossibles à tracer.
Si l'on choisit d'utiliser un processus Agent, l'objectif est de conserver un état simple, en encapsulant les appels au processus Agent dans un module pour organiser ces appels.
Si un travail coûteux doit être effectué dans un autre processus, il convient d'envisager un processus Task (en utilisant Task). S'il s'avère qu'un processus doit conserver un état et exécuter des comportements, il convient d'envisager un processus GenServer (en utilisant GenServer).