Sobes.tech
Middle

Dartda asinxronlik haqida bilimingiz qanday?

sobes.tech AI

AIdan javob

Dart'da asinxronlikni amalga oshirish uchun:

  • "Izolyatorlar" (Isolates) konsepti: Mustaqil ish jarayonlari, har biri o'z xotirasiga ega. Ular resurslarga boy vazifalarni parallel ravishda bajarish uchun ishlatiladi, asosiy foydalanuvchi interfeysining oqimini bloklamasdan. Izolyatorlar o'rtasida aloqa portlar (ReceivePort, SendPort) orqali amalga oshadi.

  • Kalit so'zlar async, await:

    • async funksiyani belgilaydi, u asinxron operatsiyalarni bajaradi va Future qaytaradi.
    • await async funksiyasi ichida ishlatiladi va Future ning yakunlanishini kutadi. await ga erishilganda, funksiyaning bajarilishi to'xtatiladi, boshqa operatsiyalar bajarilishi uchun imkon beradi, Future qiymat yoki xato bilan yakunlanganda.
    Future<String> fetchData() async {
      // Kechikishni taqlid qilish
      await Future.delayed(Duration(seconds: 2));
      return 'Ma`lumotlar olindi';
    }
    
    void main() async {
      print('Boshlanish');
      String result = await fetchData(); // fetchData yakunlanishini kutamiz
      print(result);
      print('Tugash');
    }
    
  • Future<T> sinfi: Asinxron operatsiyaning natijasini ifodalaydi, kelajakda mavjud bo'ladi. Future uch holatda bo'lishi mumkin:

    • Yakunlanmagan (uncompleted)
    • Qiymat bilan yakunlangan (completed with a value)
    • Xato bilan yakunlangan (completed with an error)

    Future ning yakunlanishini boshqarish uchun then(), catchError(), whenComplete() yoki await ishlatiladi.

  • Stream<T> sinfi: Asinxron voqealar ketma-ketligini ifodalaydi. Ma'lumotlar oqimlarini, masalan, fayldan o'qish, tarmoq orqali ma'lumotlarni qabul qilish, foydalanuvchi interfeysi voqealarini boshqarish uchun ishlatiladi. Oqim yagona subskripsiya (single-subscription) yoki ko'p subskripsiya (broadcast) bo'lishi mumkin. Voqealarni boshqarish listen(), async*, yield yordamida amalga oshiriladi.

    Stream<int> countStream(int to) async* {
      for (int i = 1; i <= to; i++) {
        await Future.delayed(Duration(seconds: 1));
        yield i; // Oqimga qiymat yuborish
      }
    }
    
    void main() {
      Stream<int> stream = countStream(3);
      stream.listen(
        (data) => print('Qabul qilindi: $data'),
        onError: (error) => print('Xato: $error'),
        onDone: () => print('Oqim tugadi'),
      );
    }
    

Dart'da asinxronlik "voqealar tsikli" (event loop) modeliga asoslangan. Asosiy oqim ketma-ket kod bajaradi, lekin await yoki Future.then bilan to'qnashganda, uni "voqealar to'plamiga" (event queue) yuboradi va keyingi kodni bajarishda davom etadi. Asinxron operatsiya tugagach, uning natijasi qaytariladi va "voqealar to'plamiga" yuboriladi. Voqealar tsikli doimiy ravishda "voqealar to'plamini" tekshiradi va asosiy oqim bo'sh bo'lsa, vazifalarni bajaradi.