Zähle die Häufigkeit der Buchstaben in Texten mithilfe paralleler Berechnung.
Bei Parallelität geht es darum, Dinge parallel zu erledigen, die man auch nacheinander erledigen kann. Ein häufiges Beispiel ist das Zählen der Buchstabenhäufigkeit. Nutze die Parallelität, um die Gesamthäufigkeit jedes Buchstabens in einer Liste von Texten zu berechnen.
JavaScript ist von Natur aus single-threaded, daher fehlen ihm viele Sprachmerkmale, die andere Sprachen besitzen, um parallele Codeausführung zu ermöglichen.
Tatsächlich gibt es nur einen Weg, eine „echte“ parallele Codeausführung zu erreichen: über Worker threads (auch Web Workers genannt).
Fast immer läuft Code, der parallel ausgeführt zu werden scheint, wie async functions oder Promises, in Wahrheit nebenläufig ab.
Das ist oft sogar besser, denn modernes JavaScript ist genau dafür optimiert, und du siehst häufig Code, der parallele Ausführung mit Promise.all() und anderen nebenläufigen Ausführungsmethoden „nachahmt“ (oder „vortäuscht“).
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.
Hier eine kurze Definition für beide, die die Unterschiede zwischen ihnen verdeutlicht:
Der Vollständigkeit halber noch eine Definition für synchrone Ausführung:
Auch wenn JavaScript standardmäßig single-threaded ist, gibt es eine Möglichkeit, Code parallel auszuführen.
Wenn du JavaScript im Browser ausführst (z. B. in einer Web-App), dann erreichst du Parallelität über die Web Worker API. Wie MDN es beschreibt:
Web Workers ermöglichen es, eine Skriptoperation in einem Hintergrund-Thread auszuführen, getrennt vom Hauptausführungs-Thread einer Anwendung.
Wenn dein JavaScript dagegen in Node.js läuft, der Ziel-Laufzeitumgebung von Exercism, heißt dasselbe Konzept 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!
Hier ist eine einfache Demo der Web Worker API (entnommen aus 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);
};
Und hier eine Demo der Worker threads API (entnommen aus der Dokumentation)
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!
Als zusätzliche Herausforderung kannst du überlegen, ob sich deine Implementierung so anpassen lässt, dass sie Worker threads nutzt.
Melde dich bei Exercism an, um JavaScript mit 37 Konzepte159 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.
Wir schauen uns die Unterschiede zwischen Nebenläufigkeit und Parallelität an und betrachten verschiedene Ansätze, die Sprachen wie JavaScript, Go, Elixir und Rust wählen.