في حين أن إنشاء عملية أمر سهل، فإن إدارة حالتها وسلوكها قد تصبح معقّدة للغاية. ووحدة 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).