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:asyncjelzi, hogy a függvény aszinkron műveleteket fog végrehajtani ésFuture-t ad vissza.await-et azasyncfüggvényen belül használjuk, hogy megvárjuk egyFuturebefejező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 aFutureé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ő. AFuturehárom állapotban lehet:- Nem befejezett (uncompleted)
- Befejezett értékkel (completed with a value)
- Hiba esetén (completed with an error)
A
Futurebefejezésének kezelése athen(),catchError(),whenComplete()vagyawaitsegí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 alisten(),async*,yieldsegí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.