Sobes.tech
Middle+

Πώς υλοποιείται η πολυνηματικότητα στο Node.js;

sobes.tech AI

Απάντηση από AI

Το Node.js είναι εγγενώς μονονηματικό για την εκτέλεση κώδικα JavaScript χρήστη. Η πολυδιεργασία επιτυγχάνεται μέσω μη μπλοκαριστικών εισόδου/εξόδου και του Event Loop. Η πολυνηματική εκτέλεση βαρέων εργασιών υλοποιείται με το module worker_threads.

Event Loop:

  • Ο κύριος μηχανισμός για ασύγχρονες λειτουργίες.
  • Μονονηματικός κύκλος που επεξεργάζεται callbacks που σχετίζονται με λειτουργίες I/O, χρονόμετρα και άλλα ασύγχρονα γεγονότα.

Worker Threads:

  • Επιτρέπουν την παράλληλη εκτέλεση βαρέων CPU-bound εργασιών.
  • Κάθε worker ξεκινά το δικό του V8 JavaScript engine σε ξεχωριστό νήμα.
  • Η επικοινωνία μεταξύ του κύριου νήματος και των workers γίνεται μέσω αποστολής μηνυμάτων (postMessage, receiveMessage).

Σύγκριση:

Μηχανισμός Σκοπός Παραλληλισμός Απομόνωση καταστάσεων Χρήση μνήμης Πολυπλοκότητα Καλύτερα για
Event Loop Ασύγχρονο I/O Ανταγωνισμός Κοινή κατάσταση Αποτελεσματικό Χαμηλή Εργασίες I/O-bound
Worker Threads Υπολογισμοί CPU-bound Παραλληλισμός Απομονωμένο Πιο υψηλή Μέτρια CPU-bound εργασίες

Παράδειγμα χρήσης του worker_threads:

// main.js
const { Worker, isMainThread, parentPort } = require('worker_threads');

if (isMainThread) {
  // Αυτό είναι το κύριο νήμα
  const worker = new Worker(__filename); // Δημιουργία worker με το ίδιο αρχείο

  worker.on('message', (msg) => {
    console.log(`Μήνυμα από τον worker: ${msg}`);
  });

  worker.on('error', (err) => {
    console.error(err);
  });

  worker.on('exit', (code) => {
    if (code !== 0)
      console.error(`Ο worker τερματίστηκε με κωδικό ${code}`);
  });

  worker.postMessage('Γειά, worker!'); // Αποστολή μηνύματος στον worker

} else {
  // Αυτό είναι το νήμα του worker
  parentPort.on('message', (msg) => {
    console.log(`Μήνυμα από το κύριο νήμα: ${msg}`);
    parentPort.postMessage('Γειά, κύριο νήμα!'); // Αποστολή απάντησης
  });
}

Το Event Loop διαχειρίζεται σε επίπεδο Node.js και libuv, ενώ το worker_threads παρέχει API για τη ρητή δημιουργία και διαχείριση νημάτων για την εκτέλεση JavaScript κώδικα.