Web Development Web Workers এর সাথে Main Thread এর Communication গাইড ও নোট

371

Web Workers হল HTML5 এর একটি শক্তিশালী ফিচার যা ওয়েব অ্যাপ্লিকেশনগুলিকে প্যারালাল থ্রেডে জাভাস্ক্রিপ্ট কোড চালানোর ক্ষমতা প্রদান করে। এটি মূল থ্রেড (Main Thread) থেকে ভারী কাজগুলো আলাদা করে ব্রাউজারের UI রেন্ডারিং এবং ইউজার ইন্টারঅ্যাকশনকে মসৃণ রাখে। Web Workers ব্যবহার করে ব্যাকগ্রাউন্ডে ডেটা প্রসেসিং, ফাইল অপারেশন, API কল ইত্যাদি কার্য সম্পাদন করা যায়, যা মূল থ্রেডকে ব্লক না করে অ্যাপ্লিকেশনের পারফরমেন্স উন্নত করে।

এই অংশে আমরা আলোচনা করব কিভাবে Web Workers এবং Main Thread এর মধ্যে যোগাযোগ করা যায়, এর সাথে কিছু উদাহরণ এবং Best Practices।


১. Web Workers কী?

Web Workers হল এমন একটি ওয়েব API যা ব্যাকগ্রাউন্ড থ্রেড তৈরি করতে দেয়, যা মূল থ্রেড থেকে স্বাধীনভাবে কাজ করে। এর মাধ্যমে ভারী বা সময়সাপেক্ষ কাজগুলো প্রধান থ্রেডকে ব্লক না করে সম্পাদন করা যায়, ফলে ইউজার ইন্টারফেসের পারফরমেন্স ভালো থাকে।

Web Workers এর বৈশিষ্ট্য:

  • প্যারালাল প্রসেসিং: মূল থ্রেডের পাশাপাশি কাজ করতে সক্ষম।
  • অ্যাসিঙ্ক্রোনাস: ব্যাকগ্রাউন্ড থ্রেডের কাজ মূল থ্রেডের কার্যকলাপে প্রভাব ফেলে না।
  • নিরাপত্তা: Web Workers শুধুমাত্র একই উৎস (same origin) থেকে স্ক্রিপ্ট লোড করতে পারে।
  • কমিউনিকেশন: postMessage এবং onmessage ইভেন্ট হ্যান্ডলার ব্যবহার করে মেসেজ আদান-প্রদান করা হয়।

২. Web Workers এবং Main Thread এর মধ্যে যোগাযোগ

Web Workers এবং Main Thread এর মধ্যে যোগাযোগ করার প্রধান উপায় হল Message Passing। এর মাধ্যমে ডেটা পাঠানো এবং গ্রহণ করা হয়।

২.১. Message Passing এর মৌলিক ধারণা
  1. Main Thread থেকে Worker এ মেসেজ পাঠানো:
    • worker.postMessage(data);
  2. Worker থেকে Main Thread এ মেসেজ পাঠানো:
    • self.postMessage(data);
  3. Message গ্রহণ করার পদ্ধতি:
    • Main Thread এ:

      worker.onmessage = function(event) {
          console.log('Received from worker:', event.data);
      };
      
    • Worker এ:

      self.onmessage = function(event) {
          console.log('Received from main thread:', event.data);
      };
      
২.২. উদাহরণ: Main Thread থেকে Worker এ মেসেজ পাঠানো এবং গ্রহণ করা

Main Thread (main.js):

// Worker তৈরি করা
const worker = new Worker('worker.js');

// Worker থেকে মেসেজ গ্রহণ
worker.onmessage = function(event) {
    console.log('Main Thread: Worker থেকে পাওয়া মেসেজ:', event.data);
};

// Worker এ মেসেজ পাঠানো
worker.postMessage('Hello Worker!');

Worker (worker.js):

// Main Thread থেকে মেসেজ গ্রহণ
self.onmessage = function(event) {
    console.log('Worker: Main Thread থেকে পাওয়া মেসেজ:', event.data);
    
    // Main Thread এ মেসেজ পাঠানো
    self.postMessage('Hello Main Thread!');
};

HTML ফাইল (index.html):

<!DOCTYPE html>
<html lang="bn">
<head>
    <meta charset="UTF-8">
    <title>Web Workers উদাহরণ</title>
</head>
<body>
    <h2>Web Workers এর সাথে Main Thread এর Communication</h2>
    <script src="main.js"></script>
</body>
</html>

কাজের ধাপ:

  1. Main Thread এ একটি Worker তৈরি করা হয় worker.js স্ক্রিপ্ট লোড করে।
  2. Main Thread Worker এ একটি মেসেজ পাঠায় postMessage ব্যবহার করে।
  3. Worker সেই মেসেজ গ্রহণ করে এবং একটি উত্তর পাঠায় postMessage ব্যবহার করে।
  4. Main Thread Worker থেকে প্রাপ্ত মেসেজ গ্রহণ করে এবং কনসোলে প্রদর্শন করে।
২.৩. ডেটা স্ট্রাকচার এবং সিরিয়ালাইজেশন

Web Workers শুধুমাত্র সিরিয়ালাইজেবল ডেটা গ্রহণ করতে পারে। অর্থাৎ, Structured Clone Algorithm অনুসারে ডেটা রূপান্তরিত হয়। সাধারণত, স্ট্রিং, সংখ্যা, অবজেক্ট, অ্যারে ইত্যাদি ডেটা ধরনের সাথে কাজ করা যায়। Functions, DOM nodes ইত্যাদি ডেটা ধরণগুলি সরাসরি পাঠানো যায় না।

উদাহরণ: অবজেক্ট পাঠানো:

Main Thread (main.js):

const worker = new Worker('worker.js');

worker.onmessage = function(event) {
    console.log('Main Thread: Worker থেকে পাওয়া মেসেজ:', event.data);
};

const user = {
    name: 'Rahim',
    age: 30,
    skills: ['HTML', 'CSS', 'JavaScript']
};

worker.postMessage(user);

Worker (worker.js):

self.onmessage = function(event) {
    const user = event.data;
    console.log('Worker: Main Thread থেকে পাওয়া অবজেক্ট:', user);
    
    // ডেটা প্রসেসিং
    user.skills.push('Web Workers');
    
    // Main Thread এ আপডেট করা অবজেক্ট পাঠানো
    self.postMessage(user);
};

আউটপুট:

  • Main Thread Console:

    Worker: Main Thread থেকে পাওয়া অবজেক্ট: {name: "Rahim", age: 30, skills: Array(3)}
    Main Thread: Worker থেকে পাওয়া মেসেজ: {name: "Rahim", age: 30, skills: Array(4)}
    

৩. Advanced Communication Techniques

৩.১. Transferable Objects

Transferable Objects হল এমন ডেটা যা একটি থ্রেড থেকে অন্য থ্রেডে স্থানান্তরিত হতে পারে, যেমন ArrayBuffers। এর ফলে ডেটা কপি না করে সরাসরি স্থানান্তর করা যায়, যা পারফরমেন্সে উন্নতি করে।

উদাহরণ: ArrayBuffer স্থানান্তর করা

Main Thread (main.js):

const worker = new Worker('worker.js');

worker.onmessage = function(event) {
    console.log('Main Thread: Worker থেকে পাওয়া মেসেজ:', event.data);
};

const buffer = new ArrayBuffer(8);
const view = new Uint8Array(buffer);
for (let i = 0; i < view.length; i++) {
    view[i] = i * 2;
}

// Transferable Object হিসেবে ArrayBuffer পাঠানো
worker.postMessage(buffer, [buffer]);

// এখন buffer ব্যবহার করা যাবে না, কারণ তা Transferable হয়েছে
console.log(buffer.byteLength); // Output: 0

Worker (worker.js):

self.onmessage = function(event) {
    const buffer = event.data;
    const view = new Uint8Array(buffer);
    console.log('Worker: প্রাপ্ত ArrayBuffer:', view);
    
    // ডেটা প্রসেসিং
    for (let i = 0; i < view.length; i++) {
        view[i] += 1;
    }
    
    // পরিবর্তিত ArrayBuffer পাঠানো
    self.postMessage(buffer, [buffer]);
};

Main Thread Console:

Worker: প্রাপ্ত ArrayBuffer: Uint8Array(4) [0, 2, 4, 6]
Main Thread: Worker থেকে পাওয়া মেসেজ: Uint8Array(4) [1, 3, 5, 7]
৩.২. Shared Workers

Shared Workers হল এমন ধরনের Worker যা একাধিক ব্রাউজার ট্যাব বা উইন্ডো দ্বারা ভাগ করা যেতে পারে। এটি সাধারণত ডেটা শেয়ারিং এবং সিঙ্ক্রোনাইজেশনের জন্য ব্যবহৃত হয়।

Main Thread (main.js):

const sharedWorker = new SharedWorker('sharedWorker.js');

sharedWorker.port.onmessage = function(event) {
    console.log('Main Thread: Shared Worker থেকে পাওয়া মেসেজ:', event.data);
};

// Shared Worker এর সাথে সংযোগ স্থাপন
sharedWorker.port.start();

// Shared Worker এ মেসেজ পাঠানো
sharedWorker.port.postMessage('Hello Shared Worker!');

Shared Worker (sharedWorker.js):

onconnect = function(event) {
    const port = event.ports[0];
    
    port.onmessage = function(event) {
        console.log('Shared Worker: Main Thread থেকে পাওয়া মেসেজ:', event.data);
        port.postMessage('Hello from Shared Worker!');
    };
};

HTML ফাইল (index.html):

<!DOCTYPE html>
<html lang="bn">
<head>
    <meta charset="UTF-8">
    <title>Shared Worker উদাহরণ</title>
</head>
<body>
    <h2>Shared Worker এর সাথে Main Thread এর Communication</h2>
    <script src="main.js"></script>
</body>
</html>

৪. সুবিধা এবং সীমাবদ্ধতা

৪.১. সুবিধাসমূহ:
  1. পারফরমেন্স উন্নতি: ভারী কাজগুলো ব্যাকগ্রাউন্ড থ্রেডে সম্পাদন করে মূল থ্রেডকে মুক্ত রাখে, ফলে ইউজার ইন্টারফেস মসৃণ থাকে।
  2. প্যারালাল প্রসেসিং: একাধিক থ্রেডে কাজ করতে সক্ষম, যা সময় সাশ্রয় করে।
  3. ক্লিন কোড: ভারী কাজগুলোকে আলাদা Worker ফাইল বা মডিউলে ভাগ করে কোডকে আরও সংগঠিত করে তোলে।
  4. Scalability: বড় অ্যাপ্লিকেশনগুলিতে কর্মক্ষমতা বজায় রাখতে সহায়ক।
৪.২. সীমাবদ্ধতা:
  1. নিরাপত্তা: Workers শুধুমাত্র একই উৎস (same origin) থেকে স্ক্রিপ্ট লোড করতে পারে, যা সুরক্ষা বাড়ায় তবে সীমাবদ্ধতা সৃষ্টি করে।
  2. কমিউনিকেশন ল্যাগ: Message Passing এর মাধ্যমে ডেটা আদান-প্রদান হয়, যা কিছু ক্ষেত্রে ল্যাগ হতে পারে।
  3. স্কোপ এবং অ্যাক্সেস: Workers সরাসরি DOM অ্যাক্সেস করতে পারে না, শুধুমাত্র Message Passing এর মাধ্যমে তথ্য আদান-প্রদান করতে পারে।
  4. ব্রাউজার সমর্থন: সব ব্রাউজার Web Workers সমর্থন করে না, তাই ফ্যালব্যাক মেকানিজম থাকা উচিত।

৫. Best Practices (শ্রেষ্ঠ অনুশীলন)

  1. ভারী কাজগুলোকে Worker এ স্থানান্তর করুন:
    • ডেটা প্রসেসিং, ফাইল অপারেশন, API কল ইত্যাদি ভারী কাজগুলো Worker এ স্থানান্তর করুন।
  2. Message Passing কে সংক্ষিপ্ত এবং কার্যকর রাখুন:
    • শুধুমাত্র প্রয়োজনীয় ডেটা পাঠান এবং রিসিভ করুন, যাতে মেসেজ সাইজ কম থাকে এবং পারফরমেন্স ভালো থাকে।
  3. Error Handling সুনির্দিষ্টভাবে করুন:

    • Worker এ ত্রুটি ঘটলে Main Thread কে জানাতে Error Handling ব্যবহার করুন।

    উদাহরণ:

    // Main Thread (main.js)
    worker.onerror = function(error) {
        console.error('Worker এর ত্রুটি:', error.message);
    };
    
  4. Transferable Objects ব্যবহার করুন পারফরমেন্স উন্নত করার জন্য:
    • বড় ডেটা পাঠানোর সময় Transferable Objects ব্যবহার করে ডেটা কপি না করে সরাসরি স্থানান্তর করুন।
  5. Resource Management:

    • যখন Worker আর প্রয়োজন না, তখন Worker কে বন্ধ করুন worker.terminate() ব্যবহার করে।

    উদাহরণ:

    // Worker বন্ধ করা
    worker.terminate();
    
  6. Shared Workers এর ব্যবহার সীমিত রাখুন:
    • Shared Workers ব্যবহার করার সময় বুঝে নিন যে এটি একাধিক ট্যাব বা উইন্ডো দ্বারা শেয়ার করা হবে এবং ডেটা সিঙ্ক্রোনাইজেশন সঠিকভাবে হচ্ছে কিনা।
  7. কোডকে Modular রাখুন:
    • Worker স্ক্রিপ্টগুলোকে আলাদা ফাইল বা মডিউলে ভাগ করুন, যাতে কোডের রিডেবিলিটি এবং রিইউজেবিলিটি বাড়ে।

৬. উদাহরণ: ভারী কাজ Worker এ স্থানান্তর করা

Main Thread (main.js):

// Worker তৈরি করা
const worker = new Worker('worker.js');

// Worker থেকে মেসেজ গ্রহণ
worker.onmessage = function(event) {
    console.log('Main Thread: Worker থেকে পাওয়া ফলাফল:', event.data);
};

// ভারী কাজের ডেটা পাঠানো
const largeData = Array.from({ length: 1e7 }, (_, i) => i);
worker.postMessage(largeData);

Worker (worker.js):

self.onmessage = function(event) {
    const data = event.data;
    console.log('Worker: প্রাপ্ত ডেটা, শুরু করছি প্রসেসিং...');
    
    // ভারী কাজ: বড় অ্যারের উপাদানগুলো যোগ করা
    const sum = data.reduce((acc, val) => acc + val, 0);
    
    // ফলাফল পাঠানো
    self.postMessage(sum);
};

HTML ফাইল (index.html):

<!DOCTYPE html>
<html lang="bn">
<head>
    <meta charset="UTF-8">
    <title>Web Workers ভারী কাজ উদাহরণ</title>
</head>
<body>
    <h2>Web Workers এর সাথে ভারী কাজ সম্পাদন</h2>
    <script src="main.js"></script>
</body>
</html>

আউটপুট:

  • Main Thread Console:

    Worker: প্রাপ্ত ডেটা, শুরু করছি প্রসেসিং...
    Main Thread: Worker থেকে পাওয়া ফলাফল: 49999995000000
    

ব্যাখ্যা:

  • Main Thread একটি বড় অ্যারে Worker এ পাঠায়।
  • Worker সেই অ্যারেটি গ্রহণ করে, সমস্ত উপাদান যোগ করে এবং ফলাফল Main Thread এ পাঠায়।
  • এই প্রক্রিয়ায় Main Thread ব্লক হয় না এবং UI মসৃণ থাকে।

Web Workers হল ওয়েব অ্যাপ্লিকেশনগুলির পারফরমেন্স উন্নত করার জন্য একটি গুরুত্বপূর্ণ টুল। ভারী কাজগুলোকে ব্যাকগ্রাউন্ড থ্রেডে স্থানান্তর করে মূল থ্রেডকে মুক্ত রাখা যায়, ফলে ব্যবহারকারীর অভিজ্ঞতা ভালো হয়। Web Workers এর সাথে সঠিকভাবে যোগাযোগ এবং ডেটা ম্যানেজমেন্ট করার মাধ্যমে আপনার অ্যাপ্লিকেশনকে আরও কার্যকর এবং দক্ষ করে তুলতে পারেন।

Best Practices অনুসরণ করুন:

  • ভারী কাজগুলো Worker এ স্থানান্তর করুন।
  • Message Passing কে কার্যকর এবং সংক্ষিপ্ত রাখুন।
  • সঠিক Error Handling করুন।
  • Transferable Objects ব্যবহার করে পারফরমেন্স উন্নত করুন।
  • Worker সম্পন্ন হলে বন্ধ করুন।
  • নিরাপত্তা এবং গোপনীয়তা বজায় রাখুন।

রেফারেন্স:

Content added By
Promotion

Are you sure to start over?

Loading...