Track
/
JavaScript
JavaScript
/
Esercizi
/
Frequenza delle lettere in parallelo
Frequenza delle lettere in parallelo

Frequenza delle lettere in parallelo

Medio

Istruzioni

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.

Concorrenza e parallelismo

Ecco una breve definizione per ciascuno dei due, che illustra le differenze tra concorrenza e parallelismo:

  • La concorrenza è quando due o più attività possono iniziare, essere eseguite e completarsi in periodi di tempo sovrapposti, venendo eseguite dalla stessa unità di elaborazione.
  • Il parallelismo è quando due o più attività possono iniziare ed essere eseguite nello stesso momento, venendo eseguite in modo indipendente l'una dall'altra da unità di elaborazione separate.

Per completezza, ecco una definizione di esecuzione sincrona:

  • L'esecuzione sincrona è quando un'attività deve aspettare che un'altra attività in esecuzione termini, prima di poter partire.

Il parallelismo in JavaScript

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.


Per approfondire

Modifica tramite GitHub Il link si apre in una nuova finestra o scheda
JavaScript Exercism

Vuoi iniziare Frequenza delle lettere in parallelo?

Iscriviti a Exercism per imparare e padroneggiare JavaScript con 37 concetti159 esercizi e il mentoring di persone reali, tutto gratis.

Approfondimento su Frequenza delle lettere in parallelo!

Esploriamo le differenze tra concorrenza e parallelismo, esaminando i diversi approcci adottati da linguaggi come JavaScript, Go, Elixir e Rust.