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:
- 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.
- 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.