Middle+
Vysvetlite, ako funguje Event Loop v kontexte jazyka Dart a frameworku Flutter.
sobes.tech AI
Odpoveď od AI
Dart je jednopracovný, ale na spracovanie asynchrónnych operácií používa Event Loop.
Event Loop pozostáva zo dvoch hlavných front:
- Microtask Queue: Pre vysokoprioritné, krátke asynchrónne úlohy. Sú vykonávané ihneď po ukončení aktuálnej operácie a pred začatím spracovania nasledujúcej iterácie Event Loop.
- Event Queue: Pre vonkajšie udalosti (ako I/O, časovače, používateľský vstup). Úlohy z tejto fronty sa spracúvajú po tom, čo Microtask Queue sa stane prázdnou.
Proces práce:
- Hlavný tok vykonáva synchronný kód.
- Pri stretnutí s asynchrónnou operáciou (napr.
Future,Stream, časovač), tá sa zaregistruje a odošle do príslušnej fronty. - Event Loop neustále kontroluje Microtask Queue. Ak nie je prázdna, úlohy z nej sa vykonávajú až do úplného vyprázdnenia.
- Potom Event Loop kontroluje Event Queue. Ak nie je prázdna, berie prvú úlohu a vykoná ju.
- Tento cyklus sa opakuje, kým obe fronty nebudú prázdne a nebudú čakať žiadne asynchrónne operácie.
Príklad použitia Future a scheduleMicrotask:
void main() {
print('1. Začiatok main');
// Pridá mikroúlohu do Microtask Queue
scheduleMicrotask(() {
print('3. Mikroúloha sa vykonáva');
});
// Vytvorí asynchrónnu operáciu, ktorá sa pridá do Event Queue po ukončení
Future(() {
print('4. Future sa vykonáva (z Event Queue)');
});
// Pridá mikroúlohu do Microtask Queue
scheduleMicrotask(() {
print('5. Druhá mikroúloha sa vykonáva');
});
// Vytvorí Future s oneskorením, tiež sa odošle do Event Queue
Future.delayed(Duration(milliseconds: 10), () {
print('6. Odložený Future sa vykonáva (z Event Queue)');
});
print('2. Koniec main');
}
// Očakávaný poradí vykonávania:
// 1. Začiatok main
// 2. Koniec main
// 3. Mikroúloha sa vykonáva
// 5. Druhá mikroúloha sa vykonáva
// 4. Future sa vykonáva (z Event Queue)
// 6. Odložený Future sa vykonáva (z Event Queue)
Vo Flutteri, Event Loop riadi vykonávanie úloh UI (prekreslenie widgetov), spracovanie gest, sieťových požiadaviek a ďalších asynchrónnych operácií, zabezpečujúc plynulú prevádzku aplikácie bez blokovania UI. Dôležité úlohy Flutteru (napríklad plánovanie snímok pre rendering) často používajú Microtask Queue na dosiahnutie vyššieho prioritu.