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