Πώς λειτουργεί ο βρόχος γεγονότων (Event Loop) στο Node.js;
sobes.tech AI
Απάντηση από AI
Event Loop — είναι ένας μηχανισμός που επιτρέπει στο Node.js να εκτελεί μη μπλοκαριστικές λειτουργίες εισόδου/εξόδου, παρά το γεγονός ότι η JavaScript είναι μια γλώσσα μονού νήματος. Το Event Loop παρακολουθεί συνεχώς τη στοίβα κλήσεων, την ουρά callback και διάφορες ουρές γεγονότων (χρονοδιακόπτες, I/O).
Οι κύριες φάσεις του Event Loop:
- timers: Εκτελεί τα προγραμματισμένα callback με
setTimeout()καιsetInterval(). - pending callbacks: Εκτελεί callback λειτουργιών συστήματος εισόδου/εξόδου (π.χ. σφάλματα δικτύου), αναβληθέντα μέχρι την επόμενη επανάληψη του Event Loop.
- idle, prepare: Εσωτερικές φάσεις του Event Loop.
- poll:
- Υπολογίζει πόσο καιρό πρέπει να μπλοκάρει και να ελέγξει τις λειτουργίες εισόδου/εξόδου.
- Διαχειρίζεται γεγονότα στη ουρά callback I/O όταν φτάνουν σε ένα όριο ή ο χρόνος λήγει.
- check: Εκτελεί τα προγραμματισμένα callback με
setImmediate(). - 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 να διαχειρίζεται αποτελεσματικά πολλές παράλληλες αιτήσεις χωρίς να δημιουργεί ξεχωριστό νήμα για κάθε μία, εξασφαλίζοντας υψηλή απόδοση.