Vivasoft-logo

Compute() মেথড দিয়ে Isolate create:

int computationallyExpensiveTas(int value) {
  var sum = 0;
  for (var i = 0; i <= value; i++) {
    sum += i;
  }
  print(\'finished\');
  return sum;
}
 

compute() মেথড টা মেইনলি ফ্লাটার ফ্রেমোয়ার্ক এর। এটা isolate ক্রিয়েট এর ব্যাপার টাকে ইজি করতে একটা wrapper যেটা যারামিটার হিসেবে কোন মেথড টা রান করবে তার রেফারেন্স আর সেকেন্ড প্যারামিটার হিসেবে রিসিভ করে ইনপুট। ব্যাস তৈরি হয়ে গেল আইসোলেট এই আইসোলেট টা প্যারামটার এ দেয়া মেথড টা রান করে আউটপুট রিটার্ন করবে যেটা প্যারেন্ট আইসোলেট রিসিভ করবে।

final sum = await comute(computationallyExpensiveTask, 1000000000);
 

এছাড়াও যদি এক্সিসটিং কোন মেথড থাকে Isolate.run() দিয়েও আমরা Isolate ক্রিয়েট করতে পারি।

ুন ফিচার - Isolate Group

Lightweight isolates আর isolate groups রিসেন্টলি রিলিজ হওয়া ফিচার। এটার মাধ্যমে ওভার অল ১০ গুন পর্ফরমেন্স ইম্প্রভ ইয়েছে মোস্ট ইম্পর্ট্যান্টলি কোন মাইগ্রেশন ছাড়া। যেটা একটা বড় অর্জন। তাহলে গ্রুপ কিভাবে কাজ করে?

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

Isolate.swapnUri() নতুন একটি এডভান্স মেথড যেটা দিয়ে নতুন আইসোলেট স্পেসিফিক একটা গ্রুপে ক্রিয়েট করা যাবে Uri পাস করে।

Isolate গ্রুপ

Credit:

ইভেন্ট লুপ

Credit:

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

প্রতিটা Event loop ইন্টারনালি দুইটা Queue হ্যান্ডেল করে। Event Queue আর Microtask Queue

প্রথমে ডার্ট প্রোগ্রাম main() মেথড এক্সিকিউট করে। এর পরে চেক করে Microtask Queue এ কোন টাস্ক আছে না এম্পটি যদি থাকে তাহলে ডার্ট সর্ব প্রথমে Microtask Queue এর কাজ শেষ করবে। যতক্ষন না Microtask Queue ফাকা হবে ততক্ষন Microtask Queue এর টাস্ক গুলা প্রসেস হতে থাকবে। Microtask Queue ফাকা হলে চেক করবে আসলে Event Queue এ কোন টাস্ক আছে কিনা। Event Queue থাকলে সেটা প্রসেস করে আবার চেক করে আসবে এর মাঝে আবার Microtask Queue এ কোন টাস্ক আসছে কিনা। আসলে Microtask Queue ফাকা করে তারপর আবার Event Queue তে আসবে। এভাবে চলতে থাকবে। সব Queue ফাকা হলে প্রোগ্রাম শেষ করবে।

এখানে থেকে একটা ব্যাপার বোঝা যাচ্ছে যে Microtask Queue এর টাস্ক গুলার প্রায়োরিটি বেশি থাকবে প্রসেস এর ক্ষেত্রে। নিচের ফ্লোচার্ট টা েকে আরেকটু ভাল ভাবে বোঝা যাবেঃ

Credit:

একটা উদাহরন এর মাদ্ধ্যমে দেখা যাকঃ

void main() {
  print(\'A\');
  Future((){
    print(\'B\');
    print(\'C\');
  });
  Future.microtask((){
    print(\'D\');
    print(\'E\');
  });
  print(\'F\');
}
 

আউটপুটঃ

A
F
D
E
B
C
 

এখানে আউটপুট লক্ষ করলে দেখা যাবে প্রথমে সিংক্রোনাস কোড প্রাধান্য পেয়েছে। তাই প্রথমে প্রিন্ট করেছে A, F

তার পর যেহেতু microtask ইভেন্ট লুপে প্রাধান্য পাবে তাই microtask এর কোড টা রান করেছে, তাই প্রিন্ট করেছে D, E

এর পরে প্রিন্ট করেছে event queue এর টাস্ক এজন্যে প্রিন্ট হয়ছে B, C.