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.
Voici une définition rapide de chacun, qui illustre les différences entre les deux :
Pour être complet, voici une définition de l'exécution synchrone :
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.
Inscris-toi sur Exercism pour apprendre et maîtriser JavaScript avec 37 concepts159 exercices, et un vrai mentorat humain, le tout gratuitement.
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.