Vivasoft-logo

ডার্টে কনকারেন্সি আর প্যারালালিজম কি?

ধরো একটা কফি শপে তোমরা কফি খেতে গেছ। ধরো কফি শপ টাই ডেলিভারি ডোর একটাই, কফি শপ টাতে একজন কফি ডেলিভারি করে যে আগে আসবে সে আগে পাবে এই মেথডে। এই মেথডে স্বভাবতই কাস্টমার বেশি থাকলে অনেক বড় লাইন হবে কারন এট এ টাইম একজন কে সার্ভ করবে। এখানে যে সবার লাস্টে আসবে তার পালা আসতে আসতে অনেটা সময় লাগবে। আরেকটা উদাহরন ধরো, আরেকটা কফি শপে ডেলিভারি ডোর দুইটা এবং দুইজন কফি সার্ভ করে একই সাথে। এখানে যদি দুইটা লাইনে সার্ভ করে তাহলে আগের মেথডের চেয়ে দ্রুত তারা সার্ভ করতে পারবে। ডার্ট প্রোগ্রাম ও ঠিক একই ভাবে কাজ করেঃ

কনকারেন্সি হলো এমন একটা মেথড যেইটাই এট এ টাইম সেইম বিক্ষিপ্ত ভাবে প্রোগ্রামের মাল্টিপল প্রসেস রান করবে, একই সাথে দুই বা ততধিক কাজ করতে পারবে। প্যারালালিজম হলো এট এ টাইম দুইটা প্রসেস দুই বা ততধিক ড্রিফ্রেন্ট থ্রেডে গিভেন টাইমে প্যারালালি বা পাশাপাশি কাজ করবে। কিন্ত বাই ডিফল্ট ডার্ট সিংগেল থ্রেডে রান করার কারনে কোড সিংক্রোনাস ওয়েতে কাজ করে লাইন বাই লাইন। ধরো একটা কফি ডেলিভারি তে ৫মিনিট সময় লাগে তাহলে ২০ টা কাস্টমার কে সার্ভ করতে সময় লাগবে ১০০মিনিট। প্রতিটা কফি তৈরির সময় লাইনের বাকি যেই কাস্টমার গুলা থাকবে তারা এই পুরা সময়টাই ফ্রিজ থাকবে। ইভেন কোন আপডট ও পাবে না। আমরা মেইনলি দুই ভাবে এই কনকারেন্ট বিহেভিয়ার টা পাইতে পারি যথাঃ কলব্যাক আর ব্যাকগ্রাউন্ড আইসোলেট। কলব্যাক ইউজ করে আমরা ম্যানুয়ালি সেপারেট আইসোলেট ক্রিয়েট ছাড়া কনকারেন্ট বিহাভিয়ার পাইতে পারি। নিচের উদাহরন দুইটার দিকে লক্ষ করোঃ

উদাহরন ১ঃ

void main() async {
  print('program starts: ');
  print(await getCoffee());
  print('program ends: ');
}

Future getCoffee() async{
  await Future.delayed(const Duration(seconds: 5));
  return 'Coffee';
}
 

আউটপুটঃ

program starts:
Coffee
program ends:
 

এই প্রোগ্রাম টি রান দিলে প্রথমে program starts: প্রিন্ট করবে তারপর ৫ সেকেন্ডের জন্যে পরের লাইনে এক্সিকিউশন থেমে থাকবে যতক্ষন না getCofee() মেথড টা কফি রিটার্ন করে। ৫ সেকেন্ড পরে প্রিন্ট করবে Coffee এর পরে নেক্সট লাইন এক্সিকিউট করে প্রিন্ট করবে program ends: তার মানে আমরা কনকারেন্সির যেই বেনিফিট টা সেটা সিংগেল থ্রেডে পাচ্ছিনা কারন কোড async হলেও বিহেভিওর হলো sync এর মতই। সেইম ভাবে যদি ফ্লাটার এপে গান শোনার পাশাপাশি মিডিয়ামে আর্টিকেল ফেচ করতে চাই পারব না সিংগেল থ্রেডে async/await দিয়ে। গান শোনা শেষ না হওয়া পর্যন্ত আরেকটা নেটওয়ার্ক কল করতে পারবোনা।

এবার পরের Callback এর উদাহরন টা লক্ষ করোঃ

উদাহরন ২ঃ

void main() async {
  print('program starts: ');
  getCoffee().then((coffee) {
    print(coffee);
  });
  print('program ends: ');
}

Future getCoffee() async{
  await Future.delayed(const Duration(seconds: 5));
  return 'Coffee';
}
 

আউটপুটঃ

program starts:
program ends:
Coffee
 

এই প্রোগ্রাম টি রান দিলে প্রথমে program starts: প্রিন্ট করবে তারপর ৫ সেকেন্ডের জন্যে পরের লাইনে এক্সিকিউশন থেমে থাকবে না getCofee() যাস্ট কল দিয়ে নেক্সট লাইন প্রিন্ট করবে program ends: । তারপার ৫ সেকেন্ড পরে প্রিন্ট করবে Coffee। তার মানে আমরা কনকারেন্সির যেই বেনিফিট টা সেটা এখানে পাচ্ছি কারন কোড async ওয়ে তে কাজ করছে। সেইম ভাবে যদি ফ্লাটার এপে গান শোনার পাশাপাশি মিডিয়ামে আর্টিকেল ফেচ করতে চাই এই মেথডে পারব কারন গান শোনা শেষ না হওয়া আগেই আমি আরেকটা নেটওয়ার্ক কল করতে পারবো।