Sobes.tech
Middle+

Εξηγήστε πώς λειτουργεί το Event Loop στο πλαίσιο της γλώσσας Dart και του framework Flutter.

sobes.tech AI

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

Η Dart είναι μονονηματική (single-threaded), αλλά χρησιμοποιεί το Event Loop για τη διαχείριση ασύγχρονων λειτουργιών.

Ο Event Loop αποτελείται από δύο κύριες ουρές:

  1. Microtask Queue: για εργασίες υψηλής προτεραιότητας και μικρού μήκους. Εκτελούνται αμέσως μετά την ολοκλήρωση της τρέχουσας λειτουργίας και πριν από την επόμενη επανάληψη του Event Loop.
  2. Event Queue: για εξωτερικά γεγονότα (όπως I/O, χρονόμετρα, εισαγωγή χρήστη). Οι εργασίες αυτής της ουράς επεξεργάζονται αφού η Microtask Queue αδειάσει.

Διαδικασία λειτουργίας:

  • Το κύριο νήμα εκτελεί συγχρονικό κώδικα.
  • Όταν συναντά μια ασύγχρονη λειτουργία (π.χ., Future, Stream, χρονόμετρο), καταγράφεται και αποστέλλεται στην αντίστοιχη ουρά.
  • Ο Event Loop ελέγχει συνεχώς την Microtask Queue. Αν δεν είναι άδεια, εκτελεί τις εργασίες της μέχρι να αδειάσει.
  • Στη συνέχεια, ελέγχει την Event Queue. Αν δεν είναι άδεια, παίρνει την πρώτη εργασία και την εκτελεί.
  • Αυτός ο κύκλος επαναλαμβάνεται μέχρι και οι δύο ουρές να είναι άδειες και να μην υπάρχουν άλλες ασύγχρονες λειτουργίες σε αναμονή.

Παράδειγμα χρήσης Future και scheduleMicrotask:

void main() {
  print('1. Ξεκίνημα main');

  // Προσθέτει μια microtask στην Microtask Queue
  scheduleMicrotask(() {
    print('3. Microtask εκτελείται');
  });

  // Δημιουργεί μια ασύγχρονη λειτουργία που θα προστεθεί στην Event Queue μετά την ολοκλήρωσή της
  Future(() {
    print('4. Future εκτελείται (από την Event Queue)');
  });

  // Προσθέτει μια άλλη microtask
  scheduleMicrotask(() {
    print('5. Δεύτερη microtask εκτελείται');
  });

  // Δημιουργεί ένα Future με καθυστέρηση, επίσης αποστέλλεται στην Event Queue
  Future.delayed(Duration(milliseconds: 10), () {
    print('6. Καθυστερημένο Future εκτελείται (από την Event Queue)');
  });

  print('2. Τέλος main');
}

// Αναμενόμενη σειρά εκτέλεσης:
// 1. Ξεκίνημα main
// 2. Τέλος main
// 3. Microtask εκτελείται
// 5. Δεύτερη microtask εκτελείται
// 4. Future εκτελείται (από την Event Queue)
// 6. Καθυστερημένο Future εκτελείται (από την Event Queue)

Στο Flutter, το Event Loop διαχειρίζεται την εκτέλεση εργασιών UI (όπως η ανακατασκευή widget), την επεξεργασία gestures, αιτήματα δικτύου και άλλες ασύγχρονες λειτουργίες, διασφαλίζοντας ομαλή λειτουργία της εφαρμογής χωρίς να μπλοκάρει το UI. Οι σημαντικές εργασίες του Flutter (π.χ., ο προγραμματισμός καρέ για rendering) συχνά χρησιμοποιούν την Microtask Queue για υψηλότερη προτεραιότητα.