Sobes.tech
Middle

Mennyire ismered az aszinkronitást a Dartban?

sobes.tech MI

Válasz az MI-től

A Dartben az aszinkronitás a következőképpen valósul meg:

  • "Izolátumok" (Isolates) fogalma: Független munkafolyamatok, mindegyik saját memóriával. Ezek párhuzamosan végzik a erőforrás-igényes feladatokat anélkül, hogy blokkolnák a fő felhasználói felület szálát. Az izolátumok közötti kommunikáció portokon (ReceivePort, SendPort) keresztül történik.

  • Kulcsszavak async, await:

    • async jelzi, hogy a függvény aszinkron műveleteket fog végrehajtani és Future-t ad vissza.
    • await-et az async függvényen belül használjuk, hogy megvárjuk egy Future befejeződését. Amikor eléri, a függvény végrehajtása szünetel, lehetővé téve más műveletek végrehajtását, amíg a Future értékkel vagy hibával be nem fejeződik.
    Future<String> fetchData() async {
      // Késleltetés szimulálása
      await Future.delayed(Duration(seconds: 2));
      return 'Adatok megérkeztek';
    }
    
    void main() async {
      print('Kezdet');
      String result = await fetchData(); // Várunk a fetchData befejezésére
      print(result);
      print('Vége');
    }
    
  • A Future<T> osztály: Egy aszinkron művelet eredményét reprezentálja, amely a jövőben lesz elérhető. A Future három állapotban lehet:

    • Nem befejezett (uncompleted)
    • Befejezett értékkel (completed with a value)
    • Hiba esetén (completed with an error)

    A Future befejezésének kezelése a then(), catchError(), whenComplete() vagy await segítségével történik.

  • A Stream<T> osztály: Egy aszinkron események sorozatát reprezentálja. Adatfolyamok kezelésére használják, például fájl olvasására, hálózaton keresztüli adatok fogadására, felhasználói felület eseményeire. A stream lehet egyedi (single-subscription) vagy többfelhasználós (broadcast). Az események kezelése a listen(), async*, yield segítségével történik.

    Stream<int> countStream(int to) async* {
      for (int i = 1; i <= to; i++) {
        await Future.delayed(Duration(seconds: 1));
        yield i; // Érték küldése a streambe
      }
    }
    
    void main() {
      Stream<int> stream = countStream(3);
      stream.listen(
        (data) => print('Kapott: $data'),
        onError: (error) => print('Hiba: $error'),
        onDone: () => print('Stream vége'),
      );
    }
    

A Dartben az aszinkronitás az "eseményhurkó" (event loop) modelljén alapul. A fő szál szekvenciálisan hajtja végre a kódot, de amikor egy aszinkron művelettel (pl. await vagy Future.then) találkozik, azt a "eseménykészlet" (event queue) részévé teszi, és folytatja a következő kód végrehajtását. Amikor az aszinkron művelet befejeződik, az eredmény visszaküldésre kerül az "eseménykészlet"-be. Az eseményhurka folyamatosan ellenőrzi az "eseménykészletet" és végrehajtja a feladatokat, amikor a fő szál szabad.