فراوانی حروف را در متنها با استفاده از محاسبات موازی بشمارید.
موازیسازی یعنی کارهایی را بهصورت موازی انجام دهیم که میتوان آنها را بهصورت متوالی هم انجام داد. یک مثال رایج، شمردن فراوانی حروف است.
برای محاسبهی فراوانی کل هر حرف در فهرستی از متنها، از موازیسازی استفاده کنید.
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 در پیش میگیرند نگاه میکنیم.