Μέτρησε τη συχνότητα των γραμμάτων σε κείμενα χρησιμοποιώντας παράλληλο υπολογισμό.
Ο παραλληλισμός αφορά την εκτέλεση παράλληλα πραγμάτων που μπορούν να γίνουν και σειριακά. Ένα συνηθισμένο παράδειγμα είναι η μέτρηση της συχνότητας των γραμμάτων. Χρησιμοποίησε παραλληλισμό για να υπολογίσεις τη συνολική συχνότητα κάθε γράμματος σε μια λίστα με κείμενα.
Η 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 στον browser (π.χ. σε μια web εφαρμογή), τότε ο τρόπος να πετύχεις παραλληλισμό είναι μέσω του 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.