Process তৈরি এবং Message Passing in Elixir
Elixir একটি concurrent এবং distributed প্রোগ্রামিং ভাষা যা Erlang Virtual Machine (BEAM) এর উপর ভিত্তি করে তৈরি। Elixir এর শক্তিশালী কনকারেন্সি মডেল এটি একাধিক প্রক্রিয়া (process) চালানোর মাধ্যমে খুব দ্রুত এবং কার্যকরভাবে কাজ করতে সাহায্য করে। এই প্রক্রিয়াগুলি lightweight হয় এবং তারা একে অপরের সাথে message passing মাধ্যমে যোগাযোগ করে। চলুন দেখি কিভাবে Elixir তে process তৈরি এবং message passing করা হয়।
Process তৈরি in Elixir
Elixir তে প্রতিটি কার্যক্রম একটি process হিসেবে চলতে থাকে। Elixir এর actor model অনুযায়ী, প্রতিটি প্রক্রিয়া স্বাধীনভাবে কাজ করে এবং তারা একে অপরের সাথে মেসেজ পাঠানোর মাধ্যমে যোগাযোগ করে। Elixir তে একটি প্রক্রিয়া শুরু করার জন্য spawn/1 বা spawn/3 ফাংশন ব্যবহার করা হয়।
Process তৈরির Syntax:
pid = spawn(fn -> IO.puts("Hello from the process!") end)এখানে:
spawn/1একটি নতুন প্রক্রিয়া তৈরি করে এবং সেটি একটি ফাংশন রান করবে।pidহল নতুন প্রক্রিয়ার process identifier (PID), যা সেই প্রক্রিয়াটির একক চিহ্ন।
Process Creation Example:
defmodule MyProcess do
def start do
spawn(fn -> IO.puts("This is a new process!") end)
end
end
MyProcess.start()এখানে:
spawn/1এর মাধ্যমে নতুন একটি প্রক্রিয়া তৈরি করা হয়েছে, যা "This is a new process!" মেসেজ প্রিন্ট করবে।
Creating a Process with Arguments:
defmodule MyProcess do
def start do
spawn(fn -> greet("Alice") end)
end
def greet(name) do
IO.puts("Hello, #{name}!")
end
end
MyProcess.start()এখানে, greet/1 ফাংশনকে "Alice" নামের আর্গুমেন্ট পাঠানো হচ্ছে।
Message Passing in Elixir
Elixir এ message passing হল প্রক্রিয়াগুলির মধ্যে যোগাযোগের একমাত্র উপায়। যখন একটি প্রক্রিয়া অন্য প্রক্রিয়াকে মেসেজ পাঠায়, তখন তা একটি মেসেজ কোয়িউ (message queue) তে চলে যায় এবং প্রক্রিয়াটি যখন প্রস্তুত হয়, তখন মেসেজটি প্রাপ্ত হয় এবং প্রক্রিয়া তা প্রোসেস করতে পারে।
Message Passing Syntax:
send(pid, message)এখানে:
send/2ফাংশন একটি প্রক্রিয়াকে একটি মেসেজ পাঠানোর জন্য ব্যবহৃত হয়।pidহল সেই প্রক্রিয়ার process identifier।messageহল সেই প্রক্রিয়াকে পাঠানো মেসেজ।
Receiving a Message:
একটি প্রক্রিয়া message গ্রহণ করার জন্য receive ব্লক ব্যবহার করে।
receive do
msg -> IO.puts("Received message: #{msg}")
endএখানে:
receiveব্লকটি একে একে মেসেজগুলো গ্রহণ করে এবং যে মেসেজটি মেলে সেটি প্রক্রিয়া করে।
Message Passing Example
এখন, একটি উদাহরণ দেখা যাক যেখানে এক প্রক্রিয়া অন্য প্রক্রিয়াকে মেসেজ পাঠায় এবং তা প্রক্রিয়া করে।
defmodule MyModule do
def start do
pid = spawn(fn -> listen() end)
send(pid, "Hello, Process!")
end
def listen do
receive do
message -> IO.puts("Received message: #{message}")
end
end
end
MyModule.start()এখানে:
start/0ফাংশনে প্রথমে একটি প্রক্রিয়া তৈরি করা হচ্ছে, যাlisten/0ফাংশনটি চালাবে।- পরে,
send/2ব্যবহার করে প্রক্রিয়াটিকে একটি মেসেজ ("Hello, Process!") পাঠানো হচ্ছে। - প্রক্রিয়াটি
receiveব্লক দ্বারা মেসেজটি গ্রহণ করে এবং তা প্রিন্ট করে।
Multiple Messages Handling
একাধিক মেসেজ গ্রহণ করার জন্য আপনি receive ব্লকের মধ্যে একাধিক প্যাটার্ন ব্যবহার করতে পারেন।
defmodule MyModule do
def start do
pid = spawn(fn -> listen() end)
send(pid, "Hello!")
send(pid, "How are you?")
send(pid, "Goodbye!")
end
def listen do
receive do
message -> IO.puts("Received: #{message}")
end
listen() # Listen for the next message
end
end
MyModule.start()এখানে:
- প্রথম মেসেজ "Hello!" পাঠানো হয়েছে, এরপর "How are you?" এবং "Goodbye!"।
- প্রতিটি মেসেজের জন্য
receiveব্লকটি প্রক্রিয়া করবে এবং পরবর্তী মেসেজের জন্য আবার নিজেকে রিকার্সিভভাবে কল করবে।
Process and Message Passing Summary
| বৈশিষ্ট্য | Process | Message Passing |
|---|---|---|
| Process Creation | spawn/1, spawn/3 | spawn(fn -> ... end) |
| Process Identification | Process ID (PID) | Process ID (PID) |
| Communication Method | Message passing via send/2 and receive | Sending and receiving messages between processes |
| Message Format | Can be any data (atoms, strings, tuples, etc.) | Messages are received as data and processed in receive block |
| Concurrency | Processes run concurrently and independently | Multiple processes communicate asynchronously through message passing |
Conclusion
Elixir তে process এবং message passing concurrency model এর মূল উপাদান। Elixir এ প্রক্রিয়াগুলি একে অপরের সাথে মেসেজ পাঠানোর মাধ্যমে যোগাযোগ করে এবং প্রক্রিয়া গুলি খুবই lightweight এবং দক্ষ। এটি Erlang এর বিখ্যাত কনকারেন্সি মডেলকে Elixir তে বাস্তবায়িত করেছে এবং খুব সহজে অ্যাসিনক্রোনাস টাস্ক পরিচালনা করতে সাহায্য করে।
Read more