Запустити процес неважко, але керувати його станом і поведінкою буває дуже складно. Модуль Agent дає абстракцію, яка полегшує керування спільним станом у процесі Elixir.
Коли ми користуємося функціями модуля Agent, заведено інкапсулювати повʼязані з агентом функції в одному модулі.
# 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
Вибір між модулем Agent і кількома процесами взагалі залежить від того, який звʼязок між даними ми моделюємо. Агентні процеси стають у пригоді, коли спільним станом мають користуватися кілька процесів.
Часто краще уникнути окремого процесу й зберігати стан у змінній у межах функції. Варто також не поводитися з ними сліпо як із глобальною змінною, адже їх можуть змінювати інші процеси, створюючи стан гонки або помилки, які потім важко відстежити.
Якщо ми все ж таки вирішили використати агентний процес, варто прагнути зберігати простий стан, а виклики до агентного процесу інкапсулювати в модулі, щоб упорядкувати їх.
Якщо ресурсомістку роботу потрібно виконати в іншому процесі, варто розглянути процес завдання (з використанням Task). Якщо ж виявиться, що процес має зберігати стан і виконувати певну поведінку, варто розглянути процес GenServer (з використанням GenServer).