Elixir-এ সমস্ত কোড প্রসেসের ভিতরে চলে। Elixir প্রসেসগুলো:
ডিফল্টভাবে, একটি ফাংশন যে প্রসেস থেকে কল করা হয়েছে সেই একই প্রসেসে এক্সিকিউট হয়। যখন কোনো নির্দিষ্ট ফাংশন স্পষ্টভাবে একটি নতুন প্রসেসে চালানোর প্রয়োজন হয়, তখন spawn ব্যবহার করুন:
spawn/1 এমন একটি ফাংশন নেয় যা এটি সরাসরি এক্সিকিউট করবে।
spawn(fn -> 2 + 2 end)
# => #PID<0.125.0>
spawn/3 এমন একটি ফাংশন নেয় যা এটি মডিউলের নাম, ফাংশনের নাম (অ্যাটম হিসেবে) এবং সেই ফাংশনে পাঠানোর জন্য আর্গুমেন্টের একটি তালিকা দিয়ে এক্সিকিউট করবে।
spawn(String, :split, ["hello there", " "])
# => #PID<0.113.0>
একটি প্রসেস তার ফাংশন এক্সিকিউট করা শেষ হওয়ামাত্রই এক্সিট করে।
Process.alive?/1 দিয়ে আপনি পরীক্ষা করতে পারেন একটি প্রসেস এখনও সক্রিয় (এক্সিকিউট করছে) আছে কি না:
pid = spawn(fn -> 2 + 2 end)
Process.alive?(pid)
# => false
প্রসেসগুলো একে অপরের সাথে সরাসরি তথ্য শেয়ার করে না। ডেটা শেয়ার করার জন্য প্রসেসগুলো মেসেজ পাঠায়। এই কনকারেন্সি প্যাটার্নকে অ্যাক্টর মডেল বলা হয়।
send/2 ব্যবহার করে একটি প্রসেসে মেসেজ পাঠান।
send(pid, :hello)
send মেসেজটি গৃহীত হয়েছে কি না বা প্রাপক এখনও সক্রিয় আছে কি না তা পরীক্ষা করে না।একটি মেসেজ যেকোনো টাইপের হতে পারে।
receive/1 ব্যবহার করে বর্তমান প্রসেসে পাঠানো মেসেজ গ্রহণ করতে পারেন।
receive অপেক্ষা করে যতক্ষণ না প্রদত্ত কোনো প্যাটার্নের সাথে মেলে এমন একটি মেসেজ প্রসেসের মেইলবক্সে আসে।
after ব্লক ব্যবহার করে একটি টাইমআউট দেওয়া যায়।receive/1-এর ভিতরে সর্বদা একটি ক্যাচ-অল _ ক্লজ লিখুন।receive do
{:ping, sender_pid} -> send(sender_pid, :pong)
_ -> nil
after
5000 ->
{:error, "No message in 5 seconds"}
end
আপনি যদি একাধিক মেসেজ গ্রহণ করতে চান, তাহলে receive/1 বারবার কল করতে হবে। একটি কমন প্যাটার্ন হলো একটি রিকার্সিভ ফাংশন তৈরি করা, উদাহরণস্বরূপ loop নামে, যেটি receive/1 কল করে, মেসেজ নিয়ে কিছু করে এবং আরও মেসেজের জন্য অপেক্ষা করতে নিজেকে আবার কল করে। আপনি যদি একটি receive/1 কল থেকে আরেকটিতে কিছু স্টেট বহন করতে চান, তাহলে loop ফাংশনে একটি আর্গুমেন্ট পাস করে তা করতে পারেন।
def loop(state) do
receive do
:increment_by_one ->
loop(state + 1)
{:report_state, sender_pid} ->
send(sender_pid, state)
loop(state)
:stop ->
nil
_ ->
loop(state)
end
end
বাস্তবে, এই পদ্ধতি সরাসরি খুব কমই ব্যবহার করা হয়। Elixir কনকারেন্সি অ্যাবস্ট্রাকশন দেয়, যেমন Agent মডিউল বা GenServer বিহেভিয়ার, যেগুলো দুটোই রিসিভ লুপের উপরে তৈরি। তবে অ্যাবস্ট্রাকশনগুলো দক্ষভাবে ব্যবহার করতে পারার জন্য ওই বেসিকগুলো বোঝা অত্যন্ত জরুরি।