समानांतर गणना की मदद से टेक्स्ट में अक्षरों की आवृत्ति गिनिए।
समानांतरता का मतलब है उन कामों को साथ-साथ करना जिन्हें एक के बाद एक करके भी किया जा सकता है। इसका एक आम उदाहरण अक्षरों की आवृत्ति गिनना है। टेक्स्ट की सूची में हर अक्षर की कुल आवृत्ति निकालने के लिए समानांतरता अपनाइए।
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 का एक डेमो है (जो 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 के इस्तेमाल के लिए ढाला जा सकता है।
Exercism पर साइन अप कीजिए और JavaScript को 37 कॉन्सेप्ट159 अभ्यास तथा असली इंसानों से मिलने वाली मेंटरिंग के साथ सीखिए और उसमें महारत हासिल कीजिए, वह भी बिल्कुल मुफ्त।
हम कंकरेंसी और समानांतरता के बीच के अंतर पर नज़र डालते हैं, और देखते हैं कि JavaScript, Go, Elixir तथा Rust जैसी भाषाएँ कौन-कौन से अलग-अलग तरीके अपनाती हैं।