Vivasoft-logo

Isolate কি?

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

নিচের বুলেট পয়েন্ট গুলা মনে রাখা জরুরী Isolate নিয়ে কাজ করার সময়।

  • প্রতিটা Isolate এর নিজস্ব মেমরি স্পেস আছে।
  • এটা অন্য আইসোলেটে মিউটেটেড ডাটা শেয়ার করতে পারেনা।
  • দুইটা Isolate এর মধ্যে শেয়ার করা ডাটা সবসময় ডুপ্লিকেট ডাটা।
  • ReceivePort ইউজ হয় মেইনলি অন্য আইসোলেট থেকে ডাটা রিসিভ করতে।
  • SendPort ইউজ হয় মেইনলি এক আইসোলেট থেকে অন্য আইসোলেটে ডাটা সেন্ড করতে

আমরা সাধারনত দুই ভাবে isolate ক্রিয়েট করে থাকি। Isolate.spawn() আর compute() মেথড দিয়ে।

Isolate.spawn() দিয়ে আইসোলেট ক্রিয়েটঃ

import 'dart:isolate';

void foo(SendPort p) async {
  for (var i = 1; i  0; i -= 1) {
    await Future.delayed(const Duration(seconds: 1));
    print('bar: $i\n');
  }

  Isolate.exit(p);
}

void main() async {
  var p1 = ReceivePort();
  var p2 = ReceivePort();
  await Isolate.spawn(foo, p1.sendPort);
  print('Isolate 1 spawned.');
  await Isolate.spawn(bar, p2.sendPort);
  print('Isolate 2 spawned.');

  // Wait for the Isolate to complete.
  await p1.first;
  await p2.first;
  print('Done');
}
 

আউটপুটঃ

Isolate 1 spawned.
Isolate 2 spawned.
bar: 3

foo: 1

bar: 2
foo: 2


bar: 1
foo: 3


Done
 

এখানে মেইন আইসোলেটে দুইটা আইসোলেট ক্রিয়েট করা হয়ছে দুইটার প্যারামিটার হিসেবে পাঠানো হইছে। প্রথম প্যারামিটার টা হলো এই আইসোলট টা যেই মেথড রান করবে সেটার রেফারেন্স আর পরেরটা হলো সেন্ড পোর্ট যেটা দিয়ে চাইল্ড আইসোলেট থেকে ডাটা রিসিভ করবে। এই সেন্ড পোর্ট টা আমরা পাচ্ছি আসলে ReceivePort এর মধ্যে।

এখানে দুইটা মেথড আছে foo(SendPort p) and bar(SendPort p) এরা প্যারামিটার হিসেবে SendPort রিসিভ করছে। এই সেন্ড পোর্ট দিয়ে এই মেথডের কাজের শেষে এই পোর্ট দিয়ে প্যারেন্ট আইসোলেট কে মেসেজ সেন্ড করে Isolate.exit(p) মাধ্যমে। এখন পোগ্রাম টা রান করলে দেখা যাবে যে দুইটা মেথড প্যারালালি রান করবে।