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

  1. 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.
  2. 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.