Erlang-এ Inter-Process Communication (IPC) এর ব্যবহার
Inter-Process Communication (IPC) হল একটি পদ্ধতি যা বিভিন্ন প্রক্রিয়া (process) এর মধ্যে ডেটা বা বার্তা আদান-প্রদান করতে ব্যবহৃত হয়। Erlang একটি concurrent এবং distributed প্রোগ্রামিং ভাষা, যেখানে প্রক্রিয়াগুলির মধ্যে বার্তা আদান-প্রদান করতে IPC অত্যন্ত গুরুত্বপূর্ণ। Erlang এর IPC প্রধানত message passing (বার্তা প্রেরণ) এর মাধ্যমে কাজ করে, যা প্রসেসগুলিকে একে অপরের সাথে যোগাযোগ করতে দেয়।
Erlang এ, প্রতিটি প্রক্রিয়া তার নিজস্ব মেমরি স্পেসে চলে এবং একে অপরের সাথে সরাসরি মেমরি শেয়ার না করে বার্তার মাধ্যমে যোগাযোগ করে। Erlang-এ Inter-Process Communication এর মাধ্যমে প্রসেসগুলির মধ্যে নির্ভরযোগ্য এবং নির্ধারিত উপায়ে ডেটা আদান-প্রদান করা হয়।
1. Erlang এ Inter-Process Communication (IPC) এর মৌলিক ধারণা
Erlang একটি message-passing প্রোগ্রামিং মডেল ব্যবহার করে, যেখানে প্রক্রিয়াগুলি একে অপরকে বার্তা পাঠায় এবং গ্রহণ করে। Erlang এর প্রতিটি প্রক্রিয়া একটি PID (Process ID) দ্বারা চিহ্নিত হয়, এবং অন্য প্রক্রিয়ার PID-তে বার্তা পাঠানো হয়।
Erlang এ IPC এর মাধ্যমে একটি প্রক্রিয়া অন্য প্রক্রিয়ার সাথে একে অপরের ডেটা শেয়ার করতে পারে, এবং এতে asynchronous যোগাযোগ ব্যবস্থার সুবিধা রয়েছে। এটি প্রক্রিয়াগুলিকে isolation (বিচ্ছিন্নতা) প্রদান করে, অর্থাৎ একটি প্রক্রিয়া ব্যর্থ হলে অন্য প্রক্রিয়া প্রভাবিত হয় না।
2. Erlang এ IPC এর মূল উপাদান
2.1 spawn (নতুন প্রক্রিয়া তৈরি)
spawn ব্যবহার করে একটি নতুন প্রক্রিয়া তৈরি করা হয়। নতুন প্রক্রিয়া শুরু হলে, এটি PID (Process ID) ফেরত দেয়, যা সেই প্রক্রিয়ার সাথে যোগাযোগের জন্য ব্যবহৃত হবে।
Pid = spawn(ModuleName, FunctionName, Arguments).উদাহরণ:
-module(ipc_example).
-export([start/0, process_message/1]).
start() ->
Pid = spawn(ipc_example, process_message, ["Hello from main process!"]),
send(Pid, {message, "Hi, I am the main process!"}),
io:format("Message sent to process: ~p~n", [Pid]).
process_message(Message) ->
receive
{message, Msg} -> io:format("Received message: ~s~n", [Msg])
end.এখানে:
start/0ফাংশন একটি নতুন প্রক্রিয়া তৈরি করছে এবং সেই প্রক্রিয়াতে একটি বার্তা পাঠাচ্ছে।process_message/1ফাংশন বার্তা গ্রহণ করবে এবং তা আউটপুট করবে।
2.2 send (বার্তা প্রেরণ)
send ফাংশন ব্যবহার করে একটি প্রক্রিয়াকে বার্তা পাঠানো হয়। বার্তা প্রেরণের জন্য প্রক্রিয়ার PID ব্যবহার করা হয়।
send(Pid, Message).এখানে:
Pid: প্রক্রিয়ার আইডি।Message: পাঠানো বার্তা।
উদাহরণ:
send(Pid, {message, "Hello from the main process!"}).এখানে, Pid প্রাপ্ত প্রক্রিয়াকে একটি মেসেজ পাঠানো হচ্ছে।
2.3 receive (বার্তা গ্রহণ)
receive ব্লকটি Erlang এ বার্তা গ্রহণের জন্য ব্যবহৃত হয়। এটি একটি ব্লকিং অপারেশন, অর্থাৎ যদি কোনো বার্তা না থাকে, তবে প্রসেসটি অপেক্ষা করবে যতক্ষণ না একটি বার্তা আসে।
receive
Pattern1 -> Expression1;
Pattern2 -> Expression2;
...
endএখানে, যখন কোনো প্রক্রিয়া একটি নির্দিষ্ট প্যাটার্নের সাথে মেলানো বার্তা গ্রহণ করবে, তখন সেই প্যাটার্নের জন্য নির্ধারিত এক্সপ্রেশনটি কার্যকরী হবে।
উদাহরণ:
receive
{message, Msg} -> io:format("Received message: ~s~n", [Msg])
endএখানে, receive ব্লকটি {message, Msg} প্যাটার্নের মাধ্যমে বার্তা গ্রহণ করবে এবং আউটপুট প্রদান করবে।
3. Erlang এ IPC এর ব্যবহারিক প্রয়োগ
3.1 Concurrency Management
Erlang এর IPC ব্যবস্থার মাধ্যমে অনেকগুলি প্রক্রিয়া একসাথে চলতে পারে এবং একে অপরের সাথে বার্তা আদান-প্রদান করে কাজ করতে পারে। এটি concurrent systems এর জন্য উপযুক্ত, যেখানে একাধিক কাজ একসাথে চলতে থাকে।
উদাহরণ:
-module(concurrent_example).
-export([start/0, process/1]).
start() ->
Pid1 = spawn(concurrent_example, process, ["Process 1"]),
Pid2 = spawn(concurrent_example, process, ["Process 2"]),
send(Pid1, {work, "Task 1"}),
send(Pid2, {work, "Task 2"}).
process(Name) ->
receive
{work, Task} ->
io:format("~s is working on: ~s~n", [Name, Task])
end.এখানে, দুটি আলাদা প্রক্রিয়া Pid1 এবং Pid2 একে অপরের সাথে বার্তা আদান-প্রদান করছে এবং তাদের কাজের তথ্য প্রদর্শন করছে।
3.2 Fault Tolerance
Erlang এর IPC ব্যবস্থা ত্রুটি সহিষ্ণু (fault-tolerant) সিস্টেম তৈরিতে সহায়ক। যখন একটি প্রক্রিয়া ব্যর্থ হয়, তখন অন্য প্রক্রিয়া সচল থাকে এবং বার্তা প্রেরণের মাধ্যমে পুনরুদ্ধার করা সম্ভব হয়।
উদাহরণ:
-module(fault_tolerant).
-export([start/0, process/0]).
start() ->
Pid = spawn(fault_tolerant, process, []),
send(Pid, {work, "Processing data!"}),
io:format("Message sent to process: ~p~n", [Pid]).
process() ->
receive
{work, Task} ->
io:format("Processing: ~s~n", [Task]),
exit(normal)
after 1000 ->
io:format("Timeout: No work received~n")
end.এখানে, একটি প্রক্রিয়া বার্তা গ্রহণ করে এবং ত্রুটি ঘটলে অন্য প্রক্রিয়া সচল থাকবে এবং একইভাবে কাজ করবে।
4. Distributed Systems Communication
Erlang এর IPC ব্যবস্থার আরেকটি গুরুত্বপূর্ণ ব্যবহার হল distributed systems-এ, যেখানে একাধিক সার্ভার বা নোডের মধ্যে বার্তা আদান-প্রদান করা হয়। Erlang এ nodes ব্যবহার করে একাধিক সিস্টেমের মধ্যে বার্তা প্রেরণ করা সম্ভব।
উদাহরণ:
net_adm:ping(Node).এখানে, Erlang এর ping ফাংশন ব্যবহার করে এক নোড থেকে অন্য নোডের মধ্যে যোগাযোগ তৈরি করা সম্ভব।
উপসংহার
Erlang এ Inter-Process Communication (IPC) হল বার্তা প্রেরণ এবং গ্রহণের মাধ্যমে একাধিক প্রক্রিয়ার মধ্যে যোগাযোগ স্থাপন করা। spawn, send, এবং receive ফাংশনগুলি ব্যবহার করে প্রক্রিয়াগুলির মধ্যে মেসেজ আদান-প্রদান করা যায়। Erlang এর IPC ব্যবস্থার মাধ্যমে concurrent systems, distributed systems, এবং fault tolerance সিস্টেমের জন্য কার্যকরী সমাধান প্রদান করা হয়।
Read more