Sobes.tech
Middle+

Πώς λειτουργεί ο βρόχος γεγονότων (Event Loop) στο Node.js;

sobes.tech AI

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

Event Loop — είναι ένας μηχανισμός που επιτρέπει στο Node.js να εκτελεί μη μπλοκαριστικές λειτουργίες εισόδου/εξόδου, παρά το γεγονός ότι η JavaScript είναι μια γλώσσα μονού νήματος. Το Event Loop παρακολουθεί συνεχώς τη στοίβα κλήσεων, την ουρά callback και διάφορες ουρές γεγονότων (χρονοδιακόπτες, I/O).

Οι κύριες φάσεις του Event Loop:

  1. timers: Εκτελεί τα προγραμματισμένα callback με setTimeout() και setInterval().
  2. pending callbacks: Εκτελεί callback λειτουργιών συστήματος εισόδου/εξόδου (π.χ. σφάλματα δικτύου), αναβληθέντα μέχρι την επόμενη επανάληψη του Event Loop.
  3. idle, prepare: Εσωτερικές φάσεις του Event Loop.
  4. poll:
    • Υπολογίζει πόσο καιρό πρέπει να μπλοκάρει και να ελέγξει τις λειτουργίες εισόδου/εξόδου.
    • Διαχειρίζεται γεγονότα στη ουρά callback I/O όταν φτάνουν σε ένα όριο ή ο χρόνος λήγει.
  5. check: Εκτελεί τα προγραμματισμένα callback με setImmediate().
  6. close callbacks: Εκτελεί callback κλεισίματος, π.χ., socket.destroy().

Το process.nextTick() και οι μικροεργασίες (υποσχέσεις, queueMicrotask()) εκτελούνται μεταξύ των φάσεων του Event Loop και πριν από τη μετάβαση στην επόμενη φάση ή την ολοκλήρωση της τρέχουσας. Το process.nextTick() έχει υψηλότερη προτεραιότητα από τις μικροεργασίες.

// Παραδείγματα προγραμματισμού εργασιών
console.log('Έναρξη');

setTimeout(() => {
  console.log('Χρονοδιακόπτης 0');
}, 0);

setImmediate(() => {
  console.log('setImmediate');
});

process.nextTick(() => {
  console.log('nextTick');
});

Promise.resolve().then(() => {
  console.log('Promise');
});

console.log('Τέλος');

// Τυπική σειρά εκτέλεσης (μπορεί να διαφέρει ανάλογα με την έκδοση του Node.js και το φορτίο):
// Έναρξη
// Τέλος
// nextTick
// Promise
// Χρονοδιακόπτης 0  (θα εκτελεστεί στη φάση timers)
// setImmediate (θα εκτελεστεί στη φάση check)

Το Event Loop επιτρέπει στο Node.js να διαχειρίζεται αποτελεσματικά πολλές παράλληλες αιτήσεις χωρίς να δημιουργεί ξεχωριστό νήμα για κάθε μία, εξασφαλίζοντας υψηλή απόδοση.