احسب تكرار الحروف في النصوص باستخدام الحوسبة المتوازية.
التوازي يعني إنجاز مهام على التوازي يمكن أيضًا إنجازها بشكل تسلسلي. مثال شائع هو حساب تكرار الحروف. استخدم التوازي لحساب التكرار الكلي لكل حرف في مصفوفة من النصوص.
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 في المتصفح (على سبيل المثال في تطبيق ويب)، فإن الطريقة لتحقيق التوازي هي عبر 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.
سجّل في Exercism لتتعلّم وتتقن JavaScript عبر 37 مفهومًا159 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.
نستكشف الفروق بين التزامن والتوازي، ونطّلع على أساليب مختلفة تعتمدها لغات مثل JavaScript وGo وElixir وRust.