Διαδρομές
/
JavaScript
JavaScript
/
Ασκήσεις
/
Παράλληλη συχνότητα γραμμάτων
Παράλληλη συχνότητα γραμμάτων

Παράλληλη συχνότητα γραμμάτων

Μέτριο

Οδηγίες

Μέτρησε τη συχνότητα των γραμμάτων σε κείμενα χρησιμοποιώντας παράλληλο υπολογισμό.

Ο παραλληλισμός αφορά την εκτέλεση παράλληλα πραγμάτων που μπορούν να γίνουν και σειριακά. Ένα συνηθισμένο παράδειγμα είναι η μέτρηση της συχνότητας των γραμμάτων. Χρησιμοποίησε παραλληλισμό για να υπολογίσεις τη συνολική συχνότητα κάθε γράμματος σε μια λίστα με κείμενα.

Η JavaScript είναι μονονηματική από τη φύση της, οπότε της λείπουν πολλά από τα χαρακτηριστικά γλώσσας που έχουν άλλες γλώσσες για να χειρίζονται την παράλληλη εκτέλεση κώδικα. Στην πραγματικότητα, ο μόνος τρόπος να πετύχεις "πραγματική" παράλληλη εκτέλεση κώδικα είναι μέσω των Worker threads (γνωστών και ως Web Workers).

Σχεδόν πάντα, κώδικας που φαίνεται να εκτελείται παράλληλα, όπως οι async functions ή τα Promises, στην πραγματικότητα εκτελείται ταυτόχρονα. Αυτό είναι συχνά καλύτερο, αφού η σύγχρονη JavaScript είναι βελτιστοποιημένη για τέτοια χρήση, και θα δεις συχνά κώδικα που "μιμείται" (ή "ξεγελά") την παράλληλη εκτέλεση με τη χρήση του Promise.all() και άλλων μεθόδων ταυτόχρονης εκτέλεσης.

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.

Ταυτοχρονισμός έναντι παραλληλισμού

Να ένας σύντομος ορισμός για το καθένα, που δείχνει τις διαφορές μεταξύ των δύο:

  • Ταυτοχρονισμός είναι όταν δύο ή περισσότερες εργασίες μπορούν να ξεκινήσουν, να εκτελεστούν και να ολοκληρωθούν σε επικαλυπτόμενα χρονικά διαστήματα, εκτελούμενες από την ίδια μονάδα επεξεργασίας.
  • Παραλληλισμός είναι όταν δύο ή περισσότερες εργασίες μπορούν να ξεκινήσουν και να εκτελεστούν την ίδια στιγμή, εκτελούμενες ανεξάρτητα η μία από την άλλη από ξεχωριστές μονάδες επεξεργασίας.

Για λόγους πληρότητας, να και ένας ορισμός για τη σύγχρονη εκτέλεση:

  • Σύγχρονη εκτέλεση είναι όταν μια εργασία πρέπει να περιμένει να ολοκληρωθεί μια άλλη εργασία που εκτελείται, πριν μπορέσει να εκτελεστεί και αυτή.

Παραλληλισμός στη JavaScript

Αν και η JavaScript είναι από προεπιλογή μονονηματική, υπάρχει τρόπος να εκτελέσεις κώδικα παράλληλα.

Αν τρέχεις JavaScript στον browser (π.χ. σε μια web εφαρμογή), τότε ο τρόπος να πετύχεις παραλληλισμό είναι μέσω του Web Worker API. Όπως περιγράφει το MDN:

Τα Web Workers κάνουν δυνατή την εκτέλεση μιας λειτουργίας σεναρίου σε ένα νήμα υποβάθρου, ξεχωριστό από το κύριο νήμα εκτέλεσης μιας εφαρμογής.

Από την άλλη, αν η JavaScript σου τρέχει σε Node.js, που είναι το περιβάλλον εκτέλεσης-στόχος του Exercism, η ίδια έννοια είναι γνωστή ως 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!

Να ένα απλό παράδειγμα του Web Worker API (παρμένο από το 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);
};

Και εδώ ένα παράδειγμα του Worker threads API (παρμένο από την τεκμηρίωση)

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!

Ως επιπλέον στόχο, σκέψου αν η υλοποίησή σου μπορεί να προσαρμοστεί ώστε να αξιοποιεί τα Worker threads.


Περαιτέρω ανάγνωση

Επεξεργασία μέσω GitHub Ο σύνδεσμος ανοίγει σε νέο παράθυρο ή καρτέλα
JavaScript Exercism

Έτοιμος να ξεκινήσεις την άσκηση Παράλληλη συχνότητα γραμμάτων;

Γράψου στο Exercism για να μάθεις και να κατακτήσεις JavaScript με 37 έννοιες159 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.

Αναλυτική ματιά στο Παράλληλη συχνότητα γραμμάτων!

Εξερευνούμε τις διαφορές ανάμεσα στον ταυτοχρονισμό και τον παραλληλισμό, εξετάζοντας διαφορετικές προσεγγίσεις που ακολουθούν γλώσσες όπως η JavaScript, η Go, η Elixir και η Rust.