ট্র্যাক
/
JavaScript
JavaScript
/
অনুশীলনী
/
প্যারালাল অক্ষর ফ্রিকোয়েন্সি
প্যারালাল অক্ষর ফ্রিকোয়েন্সি

প্যারালাল অক্ষর ফ্রিকোয়েন্সি

মধ্যম

নির্দেশনা

প্যারালেল কম্পিউটেশন ব্যবহার করে টেক্সটে অক্ষরের ফ্রিকোয়েন্সি গণনা করুন।

প্যারালেলিজম মানে হলো এমন কিছু কাজ প্যারালেলে করা, যেগুলো সিকোয়েন্সিয়ালিও করা যায়। এর একটি কমন উদাহরণ হলো অক্ষরের ফ্রিকোয়েন্সি গণনা করা। টেক্সটের একটি তালিকায় প্রতিটি অক্ষরের মোট ফ্রিকোয়েন্সি হিসাব করতে প্যারালেলিজম ব্যবহার করুন।

JavaScript স্বভাবতই সিঙ্গল-থ্রেডেড, তাই প্যারালাল কোড এক্সিকিউশনের জন্য অন্য ভাষাগুলোতে যে বৈশিষ্ট্যগুলো থাকে, সেগুলোর অনেকটাই এর নেই। আসলে, "সত্যিকারের" প্যারালাল কোড এক্সিকিউশন পাওয়ার একমাত্র উপায় Worker threads (একে Web Workers নামেও ডাকা হয়)।

প্রায় সবসময়ই, প্যারালালে এক্সিকিউট হচ্ছে বলে মনে হওয়া কোড, যেমন async functions বা Promises, আসলে তার বদলে কনকারেন্টলি এক্সিকিউট হয়। এটাই প্রায়ই ভালো, কারণ আধুনিক JavaScript এ ধরনের ব্যবহারের জন্যই অপ্টিমাইজ করা, আর Promise.all() বা অন্য কনকারেন্ট এক্সিকিউশন পদ্ধতি ব্যবহার করে প্যারালাল এক্সিকিউশন "এমুলেট" (বা "চিট") করা কোড আপনি প্রায়ই দেখবেন।

To pass the tests for this exercise, your solution needs to execute _concurrently_ (or in parallel),
meaning that synchronous solutions (e.g. a simple `for` loop) will not pass.

কনকারেন্সি বনাম প্যারালালিজম

দুটোর মধ্যে পার্থক্য বোঝাতে এখানে প্রতিটির একটি সংক্ষিপ্ত সংজ্ঞা দেওয়া হলো:

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

সম্পূর্ণতার খাতিরে, সিনক্রোনাস এক্সিকিউশনের একটি সংজ্ঞাও দিয়ে রাখি:

  • সিনক্রোনাস এক্সিকিউশন হলো যখন একটি কাজ চলার আগে অন্য একটি চলমান কাজ শেষ হওয়ার জন্য অপেক্ষা করতে হয়।

JavaScript-এ প্যারালালিজম

JavaScript ডিফল্টভাবে সিঙ্গল-থ্রেডেড হলেও, কোড প্যারালালভাবে এক্সিকিউট করার একটি উপায় আছে।

আপনি যদি ব্রাউজারে JavaScript রান করেন (যেমন কোনো ওয়েব অ্যাপে), তাহলে প্যারালালিজম অর্জনের উপায় হলো Web Worker API। MDN যেভাবে বর্ণনা করে:

Web Workers একটি অ্যাপ্লিকেশনের মূল এক্সিকিউশন থ্রেড থেকে আলাদা একটি ব্যাকগ্রাউন্ড থ্রেডে স্ক্রিপ্টের কাজ চালানো সম্ভব করে তোলে।

অন্যদিকে, আপনার JavaScript যদি Node.js-এ চলছে, যেটি Exercism-এর টার্গেট রানটাইম, তাহলে এই একই ধারণাটি Worker threads নামে পরিচিত।

Be aware that the implementation of the worker API differs largely between browsers and other JavaScript environments.

Make sure to read the documentation for your specific runtime!

এখানে Web Worker API-এর একটি সহজ ডেমো (নেওয়া হয়েছে Medium থেকে)

// main.js
const myWorker = new Worker('worker.js');

myWorker.postMessage(5);

myWorker.onmessage = function (event) {
  console.log('Received result from worker:', event.data);
};
// worker.js
onmessage = function (event) {
  console.log('Received number from main thread:', event.data);

  // Perform computation
  const result = event.data * 2;

  // Send result back to the main thread
  postMessage(result);
};

আর এখানে Worker threads API-এর একটি ডেমো (নেওয়া হয়েছে docs থেকে)

const {
  Worker,
  isMainThread,
  parentPort,
  workerData,
} = require('node:worker_threads');

if (isMainThread) {
  module.exports = function parseJSAsync(script) {
    return new Promise((resolve, reject) => {
      const worker = new Worker(__filename, {
        workerData: script,
      });
      worker.on('message', resolve);
      worker.on('error', reject);
      worker.on('exit', (code) => {
        if (code !== 0)
          reject(new Error(`Worker stopped with exit code ${code}`));
      });
    });
  };
} else {
  const { parse } = require('some-js-parsing-library');
  const script = workerData;
  parentPort.postMessage(parse(script));
}
Currently it is not possible to implement parallelism using the online editor.

Please implement `Worker threads` using Node.js locally and submit your solution via CLI!

স্ট্রেচ গোল হিসেবে ভাবুন, Worker threads কাজে লাগানোর মতো করে আপনার ইমপ্লিমেন্টেশনটি বদলে নেওয়া যায় কি না।


আরও পড়ুন

GitHub-এর মাধ্যমে সম্পাদনা করুন লিংকটি একটি নতুন উইন্ডো বা ট্যাবে খোলে
JavaScript Exercism

প্যারালাল অক্ষর ফ্রিকোয়েন্সি শুরু করতে প্রস্তুত?

Exercism-এ সাইন আপ করুন, JavaScript ট্র্যাকের 37টি কনসেপ্ট159টি অনুশীলনী আর সত্যিকারের মানুষের মেন্টরিং দিয়ে শিখুন ও দক্ষ হয়ে উঠুন, সম্পূর্ণ বিনামূল্যে।

ডিপ ডাইভ: প্যারালাল অক্ষর ফ্রিকোয়েন্সি!

আমরা কনকারেন্সি ও প্যারালালিজমের মধ্যে পার্থক্য নিয়ে আলোচনা করি এবং JavaScript, Go, Elixir ও Rust-এর মতো ভাষাগুলো যে বিভিন্ন পদ্ধতি অবলম্বন করে তা দেখি।