راهاندازی یک فرایند آسان است، اما مدیریت حالت و رفتار آن میتواند بسیار پیچیده شود. ماژول Agent یک انتزاع است که مدیریت یک حالت اشتراکی را در یک فرایند Elixir آسان میکند.
وقتی از توابع ماژول Agent استفاده میکنید، رسم بر این است که توابع مرتبط با 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 استفاده کنید یا اصلاً از چندین فرایند بهره ببرید، به رابطهای بستگی دارد که قرار است با دادهها مدل شود.
فرایندهای Agent زمانی مفیدند که قرار باشد یک حالت اشتراکی توسط چندین فرایند استفاده شود.
اغلب انتخاب بهتری است که از یک فرایند جداگانه پرهیز کنید و به جای آن، از یک متغیر درونفرایندی برای نگهداشتن حالت در یک تابع استفاده کنید. همچنین باید مراقب بود که آنها را کورکورانه مانند یک متغیر سراسری در نظر نگیرید، چرا که ممکن است فرایندهای دیگر آنها را دستکاری کنند و شرایط رقابتی یا خطاهای غیرقابلردیابی به وجود آورند.
اگر تصمیم میگیرید از یک فرایند Agent استفاده کنید، هدف باید نگهداشتن یک حالت ساده و کپسوله کردن فراخوانیهای فرایند Agent درون یک ماژول برای ساماندهی آنها باشد.
اگر قرار است کاری پرهزینه در فرایندی دیگر انجام شود، باید یک فرایند Task (با استفاده از Task) را در نظر بگیرید. اگر مشخص شد که یک فرایند باید حالت را نگه دارد و رفتارهایی انجام دهد، باید یک فرایند GenServer (با استفاده از GenServer) را در نظر بگیرید.