Task এবং Agent এর ব্যবহার
Elixir তে Task এবং Agent দুটি গুরুত্বপূর্ণ কনসেপ্ট যা সহায়তা করে কনকারেন্ট প্রোগ্রামিং এবং স্টেট ম্যানেজমেন্ট করতে। এগুলি মূলত প্রসেস পরিচালনা এবং অ্যাসিঙ্ক্রোনাস অপারেশন (asynchronous operations) চালানোর জন্য ব্যবহৃত হয়। তবে তাদের মধ্যে কিছু পার্থক্যও রয়েছে, এবং নির্দিষ্ট পরিস্থিতিতে কোনটি ব্যবহার করা উচিত তা জানা গুরুত্বপূর্ণ।
1. Task
Task হলো Elixir এর একটি বিল্ট-ইন কনসেপ্ট যা অ্যাসিঙ্ক্রোনাস কাজ সম্পাদন করতে ব্যবহৃত হয়। Task ব্যবহার করে আপনি নতুন প্রসেসে কোনো কাজ চালাতে পারেন, যা মূল প্রসেসের সাথে একযোগে কাজ করে এবং অবিরত প্রসেসিং চালায়।
Task এর বৈশিষ্ট্য:
- অ্যাসিঙ্ক্রোনাস কার্যকলাপ: Task মূলত অ্যাসিঙ্ক্রোনাস কাজ পরিচালনা করার জন্য ব্যবহৃত হয়।
- ফাংশনাল প্রোগ্রামিং: Task ফাংশনকে প্যারালাল এবং অবস্থানগতভাবে কার্যকর করতে সহায়তা করে।
- শর্ট-লাইভ প্রসেস: Task সাধারণত একটি নির্দিষ্ট কাজ সম্পন্ন করার জন্য তৈরি করা হয়, এবং কাজ শেষে তা শেষ হয়ে যায়।
Task এর উদাহরণ:
# Task.start/1 ব্যবহার করে একটি অ্যাসিঙ্ক্রোনাস টাস্ক তৈরি করা
task = Task.start(fn ->
IO.puts "This is a task running asynchronously!"
end)
# মূল প্রসেস চালু থাকতে পারে, টাস্ক কার্যকরী হতে থাকবে
IO.puts "Main process is still running!"এখানে Task.start একটি অ্যাসিঙ্ক্রোনাস টাস্ক তৈরি করছে যা আলাদা প্রসেসে রান হচ্ছে এবং মূল প্রসেসের কাজের সাথে বিঘ্ন ঘটায় না।
Task.await/1:
Task ব্যবহারের মাধ্যমে আপনি টাস্কের ফলাফল পেতে পারেন, তবে কখনো কখনো আপনার টাস্কের সম্পূর্ণ হওয়া পর্যন্ত অপেক্ষা করার প্রয়োজন হতে পারে। এ জন্য Task.await/1 ব্যবহার করা হয়।
task = Task.start(fn ->
:timer.sleep(1000)
"Task Complete!"
end)
# Task.await ব্যবহার করে টাস্কের ফলাফল সংগ্রহ করা
result = Task.await(task)
IO.puts(result) # আউটপুট: Task Complete!এখানে, Task.await টাস্কের পূর্ণতা না হওয়া পর্যন্ত অপেক্ষা করবে এবং পরে ফলাফল রিটার্ন করবে।
2. Agent
Agent একটি প্রক্রিয়া যা একাধিক প্রসেসের মধ্যে একটি পারমাণবিক স্টেট শেয়ার করতে ব্যবহৃত হয়। Agents মূলত স্টেট ম্যানেজমেন্ট এর জন্য উপযুক্ত এবং এটি একটি প্রসেসের মধ্যে ডেটা ধারণ করে এবং সেটি অ্যাক্সেস করার জন্য সহজ উপায় প্রদান করে।
Agent এর বৈশিষ্ট্য:
- স্টেট ম্যানেজমেন্ট: Agent মূলত একটি প্রসেসে স্টেট বা ডেটা ধারণ করে এবং অন্য প্রসেসের থেকে এই ডেটা অ্যাক্সেস করার জন্য ব্যবহৃত হয়।
- এসি সিঙ্ক্রোনাস ডেটা পরিবর্তন: Agent ব্যবহার করে ডেটার স্টেট পরিবর্তন করা যায়, এবং বিভিন্ন প্রসেস একে অপরের স্টেটের সাথে যোগাযোগ করতে পারে।
- মনে রাখা এবং আপডেট করা: Agent একবারের জন্য স্টেট তৈরি করে এবং পরে সেই স্টেটকে অ্যাক্সেস এবং আপডেট করতে সাহায্য করে।
Agent এর উদাহরণ:
# Agent.start_link ব্যবহার করে একটি এজেন্ট তৈরি করা
{:ok, agent_pid} = Agent.start_link(fn -> 0 end)
# Agent.update ব্যবহার করে এজেন্টের স্টেট আপডেট করা
Agent.update(agent_pid, fn state -> state + 1 end)
# Agent.get ব্যবহার করে এজেন্টের স্টেট নেয়া
IO.puts Agent.get(agent_pid, fn state -> state end) # আউটপুট: 1এখানে, আমরা একটি এজেন্ট তৈরি করেছি যা প্রথমে 0 মান ধারণ করছে। এরপর, Agent.update ব্যবহার করে স্টেটের মান বাড়ানো হয়েছে এবং Agent.get ব্যবহার করে স্টেটের বর্তমান মান অ্যাক্সেস করা হয়েছে।
Agent.start_link/2:
এজেন্ট শুরু করার সময় আপনি ফাংশনটি দিতে পারেন যা স্টেট ইনিশিয়ালাইজ করবে। সাধারণত এটি fn -> initial_value end এর মাধ্যমে করা হয়, যেখানে initial_value হলো এজেন্টের প্রাথমিক মান।
Task এবং Agent এর মধ্যে পার্থক্য
| বৈশিষ্ট্য | Task | Agent |
|---|---|---|
| প্রধান উদ্দেশ্য | অ্যাসিঙ্ক্রোনাস কাজ চালানো | স্টেট ম্যানেজমেন্ট এবং ডেটা ধারণ |
| ডেটা ম্যানিপুলেশন | ফাংশন বা অপারেশন অ্যাসিঙ্ক্রোনাসভাবে চালানো | স্টেট পরিবর্তন এবং শেয়ার করা |
| স্টেট | কোনো স্টেট ধারণ করা হয় না | একটি প্রসেসের মধ্যে স্টেট ধারণ করা হয় |
| ফাংশন | Task.start, Task.await | Agent.start_link, Agent.update, Agent.get |
| সাজেশন | যখন কোনো কাজ এক্সিকিউট করতে হবে এবং পরে ফলাফল চান | যখন আপনি ডেটা সংরক্ষণ করতে চান এবং অন্য প্রসেস থেকে অ্যাক্সেস করতে চান |
Task এবং Agent কখন ব্যবহার করবেন?
- Task:
- যখন আপনাকে একটি অ্যাসিঙ্ক্রোনাস কাজ করতে হয় এবং তার ফলাফল পরে প্রাপ্ত করতে চান, যেমন ফাইল আপলোড, ইমেইল পাঠানো, অথবা কোনো কাজ সম্পন্ন হতে সময় লাগবে এমন অ্যাসিঙ্ক্রোনাস কার্যক্রম।
- সাধারণত ছোট মেয়াদের কাজের জন্য যা একাধিক প্রসেসে চলতে পারে।
- Agent:
- যখন আপনাকে একাধিক প্রসেসের মধ্যে একটি নির্দিষ্ট স্টেট বা ডেটা শেয়ার করতে হয়।
- যখন আপনি ডেটার মান পরিবর্তন বা ট্র্যাক করতে চান এবং সেই মান অন্যান্য প্রসেস থেকে অ্যাক্সেস করতে চান।
সারসংক্ষেপ
- Task: অ্যাসিঙ্ক্রোনাস কাজ বা প্রসেস চালানোর জন্য ব্যবহৃত হয়, এবং আপনি চাইলে কাজ শেষ হওয়ার পরে ফলাফল পেতে পারেন।
- Agent: একাধিক প্রসেসের মধ্যে স্টেট শেয়ার ও পরিচালনা করার জন্য ব্যবহৃত হয়, যা আপনার অ্যাপ্লিকেশনের স্টেট ম্যানেজমেন্ট সহজ করে।
Elixir তে Task এবং Agent আপনাকে কনকারেন্ট প্রোগ্রামিংয়ে আরো ভালো পারফরম্যান্স এবং স্থিতিস্থাপকতা (fault tolerance) দিতে সাহায্য করে।
Read more