Erlang এ receive এবং after ব্লক এর মাধ্যমে Message Handling
Erlang একটি concurrent ভাষা, যেখানে প্রসেসগুলো একে অপরের সাথে message passing এর মাধ্যমে যোগাযোগ করে। receive এবং after ব্লকগুলির মাধ্যমে Erlang-এ message handling (বার্তা পরিচালনা) করা হয়। এই ব্লকগুলি প্রসেসগুলির মধ্যে বার্তা গ্রহণ এবং সময়মতো কাজ করার জন্য ব্যবহৃত হয়।
1. receive ব্লক (Message Reception)
Erlang এ, একটি প্রসেস যখন অন্য প্রসেস থেকে একটি মেসেজ গ্রহণ করতে চায়, তখন receive ব্লক ব্যবহার করা হয়। এটি একটি অ্যাসিঙ্ক্রোনাস অপারেশন, যার মাধ্যমে প্রসেস অন্য প্রসেসের কাছ থেকে বার্তা (message) পেতে পারে। যদি একটি প্রসেসের কাছে কোনও মেসেজ না থাকে, তবে সেই প্রসেস receive ব্লকের মধ্যে অপেক্ষা করবে যতক্ষণ না বার্তা আসে।
receive ব্লকের সিনট্যাক্স:
receive
Pattern1 -> Expression1;
Pattern2 -> Expression2;
...
endএখানে, Pattern1, Pattern2 ইত্যাদি হল মেসেজের প্যাটার্ন যা প্রসেস গ্রহণ করতে পারে। যখন একটি বার্তা প্যাটার্নের সাথে ম্যাচ করবে, তখন সেই মেসেজের সাথে সম্পর্কিত Expression মূল্যায়ন হবে। একাধিক প্যাটার্ন থাকতে পারে, এবং Erlang সেগুলির মধ্যে মেলানো প্রথম প্যাটার্নটি নির্বাচন করবে।
উদাহরণ:
-module(message_handler).
-export([start/0, receive_message/0]).
start() ->
spawn(message_handler, receive_message, []).
receive_message() ->
receive
{hello, Msg} -> io:format("Received hello: ~s~n", [Msg]);
{goodbye, Msg} -> io:format("Received goodbye: ~s~n", [Msg])
end.এখানে, receive_message ফাংশন একটি মেসেজ গ্রহণ করে এবং তার প্যাটার্নের সাথে মেলানো বার্তা অনুযায়ী এক্সপ্রেশনটি কার্যকরী হবে। যদি {hello, Msg} বা {goodbye, Msg} ধরনের বার্তা আসে, তাহলে সেগুলির জন্য আলাদা আউটপুট প্রদান করা হবে।
এটি ব্যবহার করতে:
1> c(message_handler).
{ok,message_handler}
2> Pid = message_handler:start().
<0.37.0>
3> Pid ! {hello, "World"}.
Received hello: "World"এখানে, আমরা Pid প্রাপ্ত প্রসেসে {hello, "World"} মেসেজ পাঠাচ্ছি এবং প্রসেসটি সেই মেসেজ গ্রহণ করে আউটপুট প্রদান করবে।
2. after ব্লক (Timeout Handling)
Erlang এর receive ব্লক একটি সুবিধা প্রদান করে, যেটি হল after ব্লক। এটি একটি টাইমআউট নির্ধারণ করতে সাহায্য করে, যেখানে receive ব্লকটি যদি নির্দিষ্ট সময়ের মধ্যে মেসেজ না পায়, তবে এটি after ব্লকের কোড চালাবে। এটি অপেক্ষা করার সময় একটি সময়সীমা নির্ধারণ করার জন্য ব্যবহার করা হয়।
after ব্লকের সিনট্যাক্স:
receive
Pattern1 -> Expression1;
Pattern2 -> Expression2;
...
after
TimeOut -> TimeoutExpression
endএখানে, TimeOut হল টাইমআউটের সময় (মিলিসেকেন্ডে), এবং যদি মেসেজ পাওয়া না যায়, তবে TimeoutExpression চলে যাবে।
উদাহরণ:
-module(message_handler).
-export([start/0, receive_message/0]).
start() ->
spawn(message_handler, receive_message, []).
receive_message() ->
receive
{hello, Msg} -> io:format("Received hello: ~s~n", [Msg]);
{goodbye, Msg} -> io:format("Received goodbye: ~s~n", [Msg])
after 5000 -> io:format("Timeout occurred, no message received~n")
end.এখানে, receive_message/0 ফাংশনে, একটি টাইমআউটও নির্ধারণ করা হয়েছে। যদি পাঁচ সেকেন্ডের মধ্যে কোনও মেসেজ না আসে, তবে after 5000 ব্লকটি কাজ করবে এবং "Timeout occurred" বার্তা প্রদর্শিত হবে।
এটি ব্যবহার করতে:
1> c(message_handler).
{ok,message_handler}
2> Pid = message_handler:start().
<0.37.0>
3> timer:sleep(6000).
6
Timeout occurred, no message receivedএখানে, আমরা ৬ সেকেন্ডের জন্য অপেক্ষা করছি, যার ফলে টাইমআউট বার্তা প্রদর্শিত হবে কারণ কোনো মেসেজ আসেনি।
3. receive এবং after ব্যবহার করার সুবিধা
- Message Handling: Erlang এর
receiveব্লক প্রসেসের মধ্যে মেসেজ পাঠানো এবং গ্রহণ করার জন্য ব্যবহৃত হয়। এটি প্রসেসগুলির মধ্যে যোগাযোগ প্রতিষ্ঠা করতে সাহায্য করে, যা Erlang এর মূল শক্তি। - Concurrency Management: Erlang এর
receiveএবংafterব্লকগুলি বিভিন্ন প্রসেসের মধ্যে কার্যকরভাবে তথ্য আদান-প্রদান এবং টাইমআউট পরিচালনা করতে সক্ষম। এটি concurrent সিস্টেমের জন্য অপরিহার্য। - Timeout Management:
afterব্লকটি টাইমআউট পরিচালনা করতে সাহায্য করে, যাতে আপনি কোনও নির্দিষ্ট সময়সীমার মধ্যে কাজ করতে পারেন এবং এরপর টাইমআউট প্রসেসটি পরিচালনা করতে পারেন। এটি অনেক ডিস্ট্রিবিউটেড সিস্টেমে গুরুত্বপূর্ণ, যেমন সিস্টেমে কোনো কাজ বা বার্তা গ্রহণ না হলে ফেইলরিওভার বা রিপিট অ্যাটেম্পটস করা।
উপসংহার
Erlang এর receive এবং after ব্লকগুলি বার্তা গ্রহণ এবং টাইমআউট পরিচালনার জন্য ব্যবহৃত হয়। receive ব্লক প্রসেসের মধ্যে মেসেজ গ্রহণ করার জন্য এবং after ব্লকটি টাইমআউট নির্ধারণের জন্য ব্যবহৃত হয়, যা Erlang এর ডিস্ট্রিবিউটেড এবং কনকারেন্ট সিস্টেমে কার্যকরী যোগাযোগ নিশ্চিত করতে সাহায্য করে।
Read more