7-bob. Asinxroniya
Asinxroniya va kelajakka kirish
Dart tili, ko'plab zamonaviy dasturlash tillari kabi, asinxroniyani qo'llab-quvvatlaydi. Nega asinxron ham kerak? Misol uchun, grafik Android ilovasini oling. Android ilovasini ishga tushirganingizda, u asosiy foydalanuvchi interfeysida ishlaydi. Ushbu asosiy mavzu tugmani bosish, ekranni bosish va hokazo kabi barcha UI hodisalarini boshqaradi. Biz tugmachalarni bosishimiz, matn maydonlariga matn kiritishimiz mumkin va asosiy mavzuda hamma narsa qayta ishlanadi. Biroq, ilovalarning ishi, qoida tariqasida, bu bilan cheklanmaydi. Masalan, elektron pochta ilovasi
tarmoq orqali bir vaqtning o'zida so'rovlarni yuborishi mumkin - avval yozilgan xatlarni yuborish yoki yangi harflarni tekshirish uchun server bilan bog'lanish. Tarmoq so'rovi uzoq vaqt talab qilishi mumkin, ayniqsa barqaror bo'lmagan Internet muhitida. Biroq, bu tarmoq so'rovlari odatda asosiy UI oqimini bloklamaydigan tarzda yuboriladi. Agar tarmoq so'rovlari asosiy ish zarrachasida qilingan bo'lsa, foydalanuvchi kutishi kerak edi
tarmoq so'rovi yuboriladi va uning natijasi olinadi va so'rov davomida dastur bloklanadi va so'rovning tugashini kutgan bo'lardi. Biroq, ko'plab oddiy ilovalarda bu sodir bo'lmaydi - biz xat yuborishimiz va dasturni jiddiy osishsiz darhol yangi xat yozishni boshlashimiz mumkin - chunki tarmoq so'rovi asinxron tarzda amalga oshiriladi. Va u tugagach, biz faqat qandaydir bildirishnomani ko'rishimiz mumkin. Bu asinxroniyadan foydalanishning afzalligi. Va bu nafaqat tarmoqqa tegishli
so'rovlar va umuman, uzoq vaqt talab qilishi mumkin bo'lgan ilovadagi barcha og'ir vazifalar.
Dart tilining o'ziga kelsak, u bir ipli tildir - u bir vaqtning o'zida faqat bitta vazifani bajarishi mumkin. Biroq, voqea tsikli va ikkita voqea navbatini (voqea navbati va microTask navbati) amalga oshirish orqali u turli vazifalarni asinxron tarzda bajarishga imkon beradi. Xususan, har qanday Dart ilovasi ishga tushirilganda, u ishlay boshlaydi
bitta dastur chizig'i.
U ikkita navbatni ishga tushiradi, MicroTask va Event, ular bajarilishi kerak bo'lgan vazifalarni o'z ichiga oladi.
Keyinchalik, ip asosiy () funktsiyasini bajaradi va u tugagandan so'ng, voqea tsikli yoki Voqealar sikli. Ushbu tsikl MicroTask va Voqealar navbatlaridan barcha vazifalarni ketma-ket qabul qiladi va bajaradi.
MicroTask asenkron bajarilishi kerak bo'lgan kichik ichki vazifalarni saqlash uchun mo'ljallangan.
Vazifalarning aksariyati Voqealar navbatiga joylashtirilgan - bu tashqi hodisalar, masalan, GUI hodisalari (masalan, mobil ilovalardagi tugmani bosish), taymerlar, fayllarni o'qish / yozish, oqimlar bilan ishlash va hk. Kelajakdagi ob'ektlar.
Kelajakdagi sinf
Bu holatda asosiy sinf Future sinfidir. Future klassi kelajakda bajarilishini yakunlaydigan kutilayotgan operatsiya natijasini ifodalaydi. Amaliyot natijasi ba'zi qiymat yoki xato bo'lishi mumkin.
Future ob'ekti ikkita holatda bo'lishi mumkin: tugallanmagan va tugallangan. Tugallanmagan holatda, Kelajak ifodalovchi operatsiya aniqlanadi va u allaqachon bajarila boshlagan bo'lishi mumkin, ammo natija hali olinmagan. Tugallangan holatda operatsiya allaqachon bajarilishini tugatgan, uning natijasi - ba'zi qiymat yoki xato - olingan.
Keling, eng oddiy misolni ko'rib chiqaylik:
1
2
3
4
5
6
7
8
9
|
Future getMessage() {
// для эмуляции длительной операции делаем задержку в 3 секунды
return Future.delayed(Duration(seconds: 3), () => print("Пришло новое сообщение от Тома"));
}
void main() {
getMessage();
print("Проверка сообщений...");
}
|
Demak, bu yerda Future obyektini qaytaruvchi getMessage funksiyasi mavjud. Bu funksiya Future sinfining nomli konstruktorlaridan birini Future.delayed () chaqiradi. Ushbu konstruktor ikkita parametrni oladi. Birinchi parametr - bu kechikish vaqtini (Duration (soniya: 3)) o'rnatadigan Duration ob'ekti, bu holda uch soniya. Ikkinchi parametr - bu ba'zi amallarni bajaradigan ba'zi funksiya - bu holda, bu faqat konsolga xabar chiqishi.
1
|
() => print("Пришло новое сообщение от Тома")
|
Shunday qilib, uch soniyadan so'ng konsolda "Tomdan yangi xabar qabul qilindi" qatori ko'rsatiladi. Bu, asosan, Kelajak vakili bo'lgan kechiktirilgan operatsiyadir.
Asosiy funktsiyada biz getMessage funktsiyasini chaqiramiz va keyin ba'zi xabarlarni ko'rsatamiz. E'tibor bering, getMessage funksiyasi birinchi bo'lib chaqiriladi. Biroq, dasturning konsol chiqishi quyidagicha bo'ladi:
Проверка сообщений...
Пришло новое сообщение от Тома
Aslida, getMessage funksiyasi asosiy funksiyadagi barcha boshqa amallar bajarilgandan keyingina yakunlanishini ko‘rishimiz mumkin. Ya'ni, 3 soniya davom etadigan getMessage funksiyasi asinxron tarzda bajariladi. Chaqirilsa, getMessage funksiyasi tugallanmagan holatda bo'lgan Future obyektini qaytaradi. Va Future.delayed konstruktoridan funksiya bajarilgandan atigi uch soniya o'tgach, u tugallangan holatga o'tadi.
Future ishining mexanikasi shundayki, yangi Future ob'ekti aniqlanganda, u ifodalovchi operatsiya (masalan, bu holda, xabarni qabul qilish) voqea navbatiga tushadi. Keyin, Voqealar siklida asosiy funktsiyani bajargandan so'ng, bu operatsiya Voqealar navbatdan olinadi va bajariladi.
Do'stlaringiz bilan baham: |