একটি প্রসেস স্পন করা সহজ হলেও তার স্টেট ও আচরণ সামলানো খুব জটিল হয়ে উঠতে পারে। 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 প্রসেস (Task ব্যবহার করে) বিবেচনা করা উচিত। আর যদি স্থির করা হয় যে একটি প্রসেসের স্টেট ধরে রাখা ও আচরণ সম্পাদন করা উচিত, তাহলে GenServer প্রসেস (GenServer ব্যবহার করে) বিবেচনা করা উচিত।