Custom Tasks তৈরি করা
Elixir তে Task ব্যবহারের মাধ্যমে আপনি অ্যাসিঙ্ক্রোনাস কাজ চালাতে পারেন। Task মূলত একটি স্বতন্ত্র প্রসেস তৈরি করে যা নির্দিষ্ট কাজ সম্পাদন করে, এবং এর ফলে মূল প্রসেসে কোনো বিঘ্ন ঘটে না। কখনো কখনো আপনি custom tasks তৈরি করতে চাইবেন, যা আপনার নির্দিষ্ট লজিক অনুযায়ী অ্যাসিঙ্ক্রোনাস কাজ সম্পন্ন করবে। Elixir তে custom tasks তৈরি করার জন্য Task module এর সাথে start_link/2 এবং async/1 ব্যবহার করা হয়।
Custom Task তৈরি করার ধারণা
Elixir তে Task ব্যবহারের মূল উদ্দেশ্য হল নির্দিষ্ট কাজগুলো অ্যাসিঙ্ক্রোনাসভাবে চালানো, যাতে মূল প্রসেস বা সিস্টেমের কার্যক্রম থেমে না যায়। Custom Task তৈরি করার জন্য আপনি Task.start_link/2, Task.async/1, এবং Task.await/2 ব্যবহার করতে পারেন।
Task.start_link/2:
এটি একটি নতুন task শুরু করে, এবং ফাংশনটি নতুন প্রসেসে চলে।
Task.async/1:
এটি একটি অ্যাসিঙ্ক্রোনাস task শুরু করে, এবং যখন আপনি ফলাফল চান, তখন Task.await/2 ব্যবহার করে ফলাফল পাবেন।
Custom Task উদাহরণ
এখানে আমরা একটি custom task তৈরি করব, যা একটি নির্দিষ্ট কাজ (যেমন, গণনা বা ডেটা প্রসেসিং) করবে এবং অ্যাসিঙ্ক্রোনাসভাবে কাজ চালাবে।
Step 1: Custom Task মডিউল তৈরি করা
defmodule MyApp.CustomTask do
def run_task(task_id) do
# অ্যাসিঙ্ক্রোনাস কাজটি এখানে সম্পন্ন হবে
IO.puts("Task #{task_id} started.")
:timer.sleep(2000) # 2 সেকেন্ড স্লিপ (এটি কাজটি সিমুলেট করবে)
IO.puts("Task #{task_id} completed.")
{:ok, task_id}
end
endএখানে, MyApp.CustomTask মডিউলটি একটি run_task/1 ফাংশন তৈরি করেছে যা একটি নির্দিষ্ট task_id গ্রহণ করে এবং কাজ শুরু হওয়ার সময় এবং কাজ শেষ হওয়ার সময় আউটপুট প্রিন্ট করে। :timer.sleep/1 ব্যবহার করা হয়েছে, যা কাজের মাঝে ২ সেকেন্ড বিলম্ব যোগ করবে, যেন এটি অ্যাসিঙ্ক্রোনাস কাজের অনুভূতি তৈরি হয়।
Step 2: Task.start_link ব্যবহার করে Custom Task শুরু করা
defmodule MyApp.TaskManager do
def start_task(task_id) do
Task.start_link(fn -> MyApp.CustomTask.run_task(task_id) end)
end
endএখানে, MyApp.TaskManager মডিউলটি একটি start_task/1 ফাংশন তৈরি করেছে যা Task.start_link/2 ব্যবহার করে MyApp.CustomTask.run_task/1 ফাংশনটি অ্যাসিঙ্ক্রোনাসভাবে চালাবে। Task.start_link একটি নতুন প্রসেস শুরু করবে এবং মূল প্রসেসে কোনো প্রভাব ফেলবে না।
Step 3: Task.async ব্যবহার করা (অ্যাসিঙ্ক্রোনাস ফলাফল পেতে)
defmodule MyApp.TaskManager do
def start_async_task(task_id) do
task = Task.async(fn -> MyApp.CustomTask.run_task(task_id) end)
result = Task.await(task) # এখানে আমরা অ্যাসিঙ্ক্রোনাস ফলাফল পাব
IO.inspect(result)
end
endএখানে, Task.async/1 ব্যবহার করে MyApp.CustomTask.run_task/1 ফাংশনটি অ্যাসিঙ্ক্রোনাসভাবে শুরু করা হচ্ছে। Task.await/2 ব্যবহার করে সেই অ্যাসিঙ্ক্রোনাস কাজের ফলাফল অপেক্ষা করা হচ্ছে এবং ফলাফলটি রিটার্ন হচ্ছে।
Step 4: Task Manager ব্যবহার করা
# TaskManager থেকে task চালানোর উদাহরণ
MyApp.TaskManager.start_task(1) # Task 1 শুরু করা হবে অ্যাসিঙ্ক্রোনাসভাবে
MyApp.TaskManager.start_async_task(2) # Task 2 শুরু হবে এবং তার ফলাফল পাওয়া যাবেএখানে, start_task/1 মেথডটি অ্যাসিঙ্ক্রোনাস কাজ চালাবে, এবং start_async_task/1 মেথডটি ফলাফল সহ অ্যাসিঙ্ক্রোনাস কাজ চালাবে।
Task এর Error Handling
Elixir তে যখন একটি task ব্যর্থ হয়, তখন supervision এবং error handling খুব গুরুত্বপূর্ণ। আপনি যখন supervision tree ব্যবহার করেন, তখন ব্যর্থ task গুলি restart করা যায়। তবে, কখনো কখনো task এর মধ্যে explicit error handling ব্যবহার করা হয় যাতে ব্যর্থ কাজের জন্য কিছু নির্দিষ্ট ব্যবস্থা নেওয়া যায়।
Error Handling উদাহরণ:
defmodule MyApp.CustomTask do
def run_task(task_id) do
try do
IO.puts("Task #{task_id} started.")
# যদি কোনো ত্রুটি ঘটে, সেটা throw করা হবে
if task_id == 2 do
raise "Task failed!"
end
:timer.sleep(2000)
IO.puts("Task #{task_id} completed.")
{:ok, task_id}
rescue
e -> IO.puts("Error occurred: #{e.message}")
end
end
endএখানে, যদি task_id ২ হয়, তবে raise ফাংশনটি একটি ত্রুটি ঘটাবে এবং তা rescue ব্লক দ্বারা ধরা হবে।
সারসংক্ষেপ
- Task Elixir তে অ্যাসিঙ্ক্রোনাস কাজ চালানোর জন্য ব্যবহৃত হয়।
Task.start_link/2এবংTask.async/1ফাংশন দিয়ে আপনি custom tasks তৈরি করতে পারেন।- Error Handling এর মাধ্যমে task ব্যর্থ হলে তা কিভাবে পরিচালনা করা হবে তাও নির্ধারণ করা যায়।
- Task.await/2 ব্যবহার করে অ্যাসিঙ্ক্রোনাস কাজের ফলাফল পাওয়ার জন্য অপেক্ষা করা যায়।
Elixir তে Task ব্যবহারের মাধ্যমে আপনি কনকারেন্ট এবং অ্যাসিঙ্ক্রোনাস কার্যক্রম খুব সহজে এবং দক্ষভাবে সম্পাদন করতে পারেন।
Read more