Conta la frequenza delle lettere nei testi usando il calcolo parallelo.
Il parallelismo consiste nel fare in parallelo cose che si possono fare anche in sequenza. Un esempio comune è contare la frequenza delle lettere. Usa il parallelismo per calcolare la frequenza totale di ogni lettera in un elenco di testi.
JavaScript è single-threaded per natura, quindi manca di molte delle funzionalità di linguaggio che altri linguaggi hanno per gestire l'esecuzione parallela del codice.
Di fatto, l'unico modo per ottenere un'esecuzione parallela «reale» è tramite i Worker threads (detti anche Web Workers).
Quasi sempre, il codice che sembra essere eseguito in parallelo, come le async functions o le Promises, in realtà viene eseguito in modo concorrente.
Spesso è meglio così, perché il JavaScript moderno è ottimizzato per questo tipo di uso, e capiterà spesso di vedere codice che «emula» (o «bara» con) l'esecuzione parallela usando Promise.all() e altri metodi di esecuzione concorrente.
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.
Ecco una breve definizione per ciascuno dei due, che illustra le differenze tra concorrenza e parallelismo:
Per completezza, ecco una definizione di esecuzione sincrona:
Anche se per impostazione predefinita JavaScript è single-threaded, esiste un modo per eseguire il codice in parallelo.
Se esegui JavaScript nel browser (ad esempio in un'app web), il modo per ottenere il parallelismo è tramite la Web Worker API. Come descritto da MDN:
I Web Workers rendono possibile eseguire un'operazione di uno script in un thread in background separato dal thread di esecuzione principale di un'applicazione.
D'altra parte, se JavaScript viene eseguito in Node.js, che è il runtime di destinazione di Exercism, questo stesso concetto è noto come 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!
Ecco una semplice demo della Web Worker API (tratta da 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);
};
E qui c'è una demo della Worker threads API (tratta dalla documentazione)
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!
Come obiettivo extra, chiediti se l'implementazione si può adattare per usare i Worker threads.
Iscriviti a Exercism per imparare e padroneggiare JavaScript con 37 concetti159 esercizi e il mentoring di persone reali, tutto gratis.
Esploriamo le differenze tra concorrenza e parallelismo, esaminando i diversi approcci adottati da linguaggi come JavaScript, Go, Elixir e Rust.