Sobes.tech
Middle+

Magyarázza el, hogyan működik az Event Loop a Dart nyelv és a Flutter keretrendszer kontextusában.

sobes.tech MI

Válasz az MI-től

A Dart egy szálon futó (single-threaded) nyelv, de az eseményhurkot (Event Loop) használja az aszinkron műveletek kezelésére.

Az Event Loop két fő sorból áll:

  1. Microtask Queue: magas prioritású, rövid aszinkron feladatok számára. Ezek az aktuális művelet befejezése után és a következő Event Loop iteráció megkezdése előtt azonnal végrehajtódnak.
  2. Event Queue: külső eseményekhez (például I/O, időzítők, felhasználói bemenet). Ezek a feladatok a Microtask Queue kiürülése után kerülnek feldolgozásra.

Működési folyamat:

  • A fő szál szinkron kódot futtat.
  • Amikor egy aszinkron műveletet (például Future, Stream, időzítő) talál, regisztrálásra kerül és a megfelelő sorba kerül.
  • Az Event Loop folyamatosan ellenőrzi a Microtask Queue-t. Ha nem üres, végrehajtja a feladatait, amíg ki nem ürül.
  • Ezután ellenőrzi az Event Queue-t. Ha nem üres, kiválasztja az első feladatot és végrehajtja.
  • Ez a ciklus ismétlődik, amíg mindkét sor ki nem ürül, és nincs több várakozó aszinkron művelet.

Példa a Future és scheduleMicrotask használatára:

void main() {
  print('1. A main kezdete');

  // Mikro feladat hozzáadása a Microtask Queue-hoz
  scheduleMicrotask(() {
    print('3. Mikro feladat fut');
  });

  // Aszinkron művelet létrehozása, ami a Event Queue-ba kerül a befejezés után
  Future(() {
    print('4. Future fut (a Event Queue-ból)');
  });

  // Egy másik mikro feladat hozzáadása
  scheduleMicrotask(() {
    print('5. Második mikro feladat fut');
  });

  // Késleltetett Future létrehozása, szintén a Event Queue-ba kerül
  Future.delayed(Duration(milliseconds: 10), () {
    print('6. Késleltetett Future fut (a Event Queue-ból)');
  });

  print('2. A main vége');
}

// Várt végrehajtási sorrend:
// 1. A main kezdete
// 2. A main vége
// 3. Mikro feladat fut
// 5. Második mikro feladat fut
// 4. Future fut (a Event Queue-ból)
// 6. Késleltetett Future fut (a Event Queue-ból)

Flutterben az Event Loop az UI feladatok (widgetek újrarajzolása), gesztusok kezelése, hálózati kérések és más aszinkron műveletek végrehajtását irányítja, biztosítva az alkalmazás zökkenőmentes működését UI blokkolása nélkül. A Flutter fontos feladatai (például a rendereléshez szükséges frame-ek ütemezése) gyakran használják a Microtask Queue-t a magasabb prioritás eléréséhez.