Sobes.tech
Middle+

Explicați cum funcționează Event Loop în contextul limbajului Dart și al framework-ului Flutter.

sobes.tech AI

Răspuns de la AI

Dart este single-threaded, dar folosește Event Loop pentru gestionarea operațiunilor asincrone.

Event Loop constă din două cozi principale:

  1. Coada de microtask-uri (Microtask Queue): pentru sarcini asincrone de înaltă prioritate și scurte. Acestea sunt executate imediat după finalizarea operației curente și înainte de începerea următoarei iterații a Event Loop.
  2. Coada de evenimente (Event Queue): pentru evenimente externe (cum ar fi I/O, temporizatoare, input de la utilizator). Sarcinile din această coadă sunt procesate după ce Microtask Queue devine goală.

Procesul de lucru:

  • Thread-ul principal execută cod sincron.
  • Când întâlnește o operațiune asincronă (de exemplu, Future, Stream, temporizator), aceasta este înregistrată și trimisă în coada corespunzătoare.
  • Event Loop verifică constant Microtask Queue. Dacă nu este goală, sarcinile din ea sunt executate până când devine goală.
  • Apoi, verifică Event Queue. Dacă nu este goală, ia prima sarcină și o execută.
  • Acest ciclu se repetă până când ambele cozi sunt goale și nu mai există operațiuni asincrone în așteptare.

Exemplu de utilizare a Future și scheduleMicrotask:

void main() {
  print('1. Începutul main');

  // Adaugă o microtask în Microtask Queue
  scheduleMicrotask(() {
    print('3. Microtask în execuție');
  });

  // Creează o operațiune asincronă care va fi adăugată în Event Queue după finalizare
  Future(() {
    print('4. Future în execuție (din Event Queue)');
  });

  // Adaugă o altă microtask
  scheduleMicrotask(() {
    print('5. A doua microtask în execuție');
  });

  // Creează un Future cu întârziere, de asemenea trimis în Event Queue
  Future.delayed(Duration(milliseconds: 10), () {
    print('6. Future întârziat în execuție (din Event Queue)');
  });

  print('2. Sfârșitul main');
}

// Ordinea de execuție așteptată:
// 1. Începutul main
// 2. Sfârșitul main
// 3. Microtask în execuție
// 5. A doua microtask în execuție
// 4. Future în execuție (din Event Queue)
// 6. Future întârziat în execuție (din Event Queue)

În Flutter, Event Loop gestionează executarea sarcinilor UI (re-redarea widget-urilor), procesarea gesturilor, solicitările de rețea și alte operațiuni asincrone, asigurând funcționarea lină a aplicației fără blocarea UI-ului. Sarcinile importante ale Flutter (cum ar fi planificarea cadrelor pentru randare) folosesc adesea Microtask Queue pentru a obține o prioritate mai mare.