Sobes.tech
Middle+

Vysvětlete, jak funguje Event Loop v kontextu jazyka Dart a frameworku Flutter.

sobes.tech AI

Odpověď od AI

Dart je jednovlákný (single-threaded), ale používá Event Loop k řízení asynchronních operací.

Event Loop se skládá ze dvou hlavních front:

  1. Microtask Queue: pro úkoly s vysokou prioritou a krátké asynchronní úkoly. Ty se vykonají ihned po dokončení aktuální operace a před začátkem další iterace Event Loop.
  2. Event Queue: pro externí události (například I/O, časovače, vstup uživatele). Úkoly z této fronty jsou zpracovány poté, co je Microtask Queue prázdná.

Proces práce:

  • Hlavní vlákno vykonává synchronní kód.
  • Když narazí na asynchronní operaci (například Future, Stream, časovač), je zaregistrována a odeslána do příslušné fronty.
  • Event Loop neustále kontroluje Microtask Queue. Pokud není prázdná, vykoná její úkoly, dokud není prázdná.
  • Poté zkontroluje Event Queue. Pokud není prázdná, vezme první úkol a vykoná ho.
  • Tento cyklus se opakuje, dokud obě fronty nejsou prázdné a nečekají další asynchronní operace.

Příklad použití Future a scheduleMicrotask:

void main() {
  print('1. Začátek main');

  // Přidání mikroúkolu do Microtask Queue
  scheduleMicrotask(() {
    print('3. Mikroúkol se vykonává');
  });

  // Vytvoření asynchronní operace, která bude přidána do Event Queue po dokončení
  Future(() {
    print('4. Future se vykonává (z Event Queue)');
  });

  // Přidání další mikroúkolu
  scheduleMicrotask(() {
    print('5. Druhý mikroúkol se vykonává');
  });

  // Vytvoření zpožděného Future, který také přijde do Event Queue
  Future.delayed(Duration(milliseconds: 10), () {
    print('6. Zpožděný Future se vykonává (z Event Queue)');
  });

  print('2. Konec main');
}

// Očekávané pořadí vykonání:
// 1. Začátek main
// 2. Konec main
// 3. Mikroúkol se vykonává
// 5. Druhý mikroúkol se vykonává
// 4. Future se vykonává (z Event Queue)
// 6. Zpožděný Future se vykonává (z Event Queue)

V Flutteru Event Loop řídí vykonávání úkolů UI (například překreslení widgetů), zpracování gest, síťových požadavků a dalších asynchronních operací, čímž zajišťuje plynulý chod aplikace bez blokování UI. Důležité úkoly Flutteru (například plánování snímků pro renderování) často využívají Microtask Queue k dosažení vyšší priority.