المسارات
/
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 (مأخوذ من التوثيق)

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.