Tracks
/
JavaScript
JavaScript
/
Übungen
/
Parallele Buchstabenhäufigkeit
Parallele Buchstabenhäufigkeit

Parallele Buchstabenhäufigkeit

Mittel

Anleitung

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.

Nebenläufigkeit vs. Parallelität

Hier eine kurze Definition für beide, die die Unterschiede zwischen ihnen verdeutlicht:

  • Nebenläufigkeit bedeutet, dass zwei oder mehr Aufgaben starten, laufen und abgeschlossen werden können, wobei sich ihre Zeiträume überschneiden und sie von derselben Verarbeitungseinheit ausgeführt werden.
  • Parallelität bedeutet, dass zwei oder mehr Aufgaben gleichzeitig starten und laufen können, unabhängig voneinander von getrennten Verarbeitungseinheiten ausgeführt.

Der Vollständigkeit halber noch eine Definition für synchrone Ausführung:

  • Bei synchroner Ausführung muss eine Aufgabe warten, bis eine andere laufende Aufgabe abgeschlossen ist, bevor sie selbst laufen kann.

Parallelität in JavaScript

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.


Über GitHub bearbeiten Der Link öffnet sich in einem neuen Fenster oder Tab
JavaScript Exercism

Bereit, mit Parallele Buchstabenhäufigkeit zu starten?

Melde dich bei Exercism an, um JavaScript mit 37 Konzepte159 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.

Tauche tiefer in Parallele Buchstabenhäufigkeit ein!

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.