Parcours
/
JavaScript
JavaScript
/
Exercices
/
Fréquence des lettres en parallèle
Fréquence des lettres en parallèle

Fréquence des lettres en parallèle

Moyen

Instructions

Compte la fréquence des lettres dans des textes en utilisant le calcul parallèle.

Le parallélisme consiste à faire en parallèle des choses qui peuvent aussi être faites de manière séquentielle. Un exemple courant est le comptage de la fréquence des lettres. Utilise le parallélisme pour calculer la fréquence totale de chaque lettre dans un tableau de textes.

JavaScript est monothread par nature, ce qui fait qu'il lui manque beaucoup des fonctionnalités dont disposent d'autres langages pour gérer l'exécution parallèle de code. En fait, le seul moyen d'obtenir une exécution parallèle « réelle » du code, c'est de passer par les Worker threads (aussi appelés Web Workers).

Presque toujours, du code qui semble s'exécuter en parallèle, comme les async functions ou les Promises, va en réalité s'exécuter de manière concurrente. C'est souvent préférable, car le JavaScript moderne est optimisé pour ce type d'usage, et on voit souvent du code qui « émule » (ou « triche ») l'exécution parallèle en utilisant Promise.all() et d'autres méthodes d'exécution concurrente.

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.

Concurrence et parallélisme

Voici une définition rapide de chacun, qui illustre les différences entre les deux :

  • La concurrence, c'est quand deux tâches ou plus peuvent démarrer, s'exécuter et se terminer sur des périodes qui se chevauchent, tout en étant exécutées par la même unité de traitement.
  • Le parallélisme, c'est quand deux tâches ou plus peuvent démarrer et s'exécuter en même temps, chacune étant exécutée indépendamment des autres par des unités de traitement distinctes.

Pour être complet, voici une définition de l'exécution synchrone :

  • L'exécution synchrone, c'est quand une tâche doit attendre qu'une autre tâche en cours se termine avant de pouvoir s'exécuter.

Le parallélisme en JavaScript

Bien que JavaScript soit monothread par défaut, il existe un moyen d'exécuter du code en parallèle.

Si tu exécutes du JavaScript dans le navigateur (par exemple dans une application web), le moyen d'obtenir du parallélisme passe par l'API Web Worker. Comme le décrit MDN :

Les Web Workers permettent d'exécuter un script dans un thread en arrière-plan, distinct du thread d'exécution principal de l'application.

En revanche, si ton JavaScript s'exécute dans Node.js, qui est l'environnement d'exécution visé par Exercism, ce même concept s'appelle 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!

Voici une démo simple de l'Web Worker API (tirée de 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);
};

Et voici une démo de l'Worker threads API (tirée de la documentation)

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!

Pour aller plus loin, demande-toi si ton implémentation peut être adaptée pour tirer parti des Worker threads.


Lectures complémentaires

Modifie via GitHub Le lien s'ouvre dans une nouvelle fenêtre ou un nouvel onglet
JavaScript Exercism

Prêt à commencer Fréquence des lettres en parallèle ?

Inscris-toi sur Exercism pour apprendre et maîtriser JavaScript avec 37 concepts159 exercices, et un vrai mentorat humain, le tout gratuitement.

Analyse approfondie de Fréquence des lettres en parallèle !

On explore les différences entre concurrence et parallélisme, en examinant les différentes approches adoptées par des langages comme JavaScript, Go, Elixir et Rust.