Dartта асинхрондуулук жөнүндө билимиңиз кандай?
sobes.tech AI
AIден жооп
Дартта асинхрондуулук төмөнкүдөй жолдор менен ишке ашырылат:
-
"Изоляттар" (Isolates) концепциясы: Өз алдынча иштөөчү процесстер, ар бири өзүнүн эс тутуму менен. Бул параллелдүү ресурсту талап кылган тапшырмаларды негизги колдонуучу интерфейсинин агымын бөгөттөбөстөн аткаруу үчүн колдонулат. Изоляттардын ортосундагы байланыш порттор (ReceivePort, SendPort) аркылуу жүргүзүлөт.
-
async,awaitклучсөздөрү:asyncфункциясы асинхрондук операцияларды аткарып,Futureкайтарат.awaitasyncфункциясынын ичинде колдонулуп,Futureбүтүшүн күтөт.awaitке жеткенде, функциянын аткарылышы токтоп, башка операциялар аткарылууга мүмкүнчүлүк алат, ал эмиFutureжыйынтыгы же катасы менен аяктайт.
Future<String> fetchData() async { // Күтүү моделинде жайгаштыруу await Future.delayed(Duration(seconds: 2)); return 'Маалымат алынды'; } void main() async { print('Баштоо'); String result = await fetchData(); // fetchData бүтүшүн күтүп жатабыз print(result); print('Аякталуу'); } -
Future<T>классы: Асинхрондук операциянын жыйынтыгын көрсөтөт, ал келечекте жеткиликтүү болот.Futureүч абалда болушу мүмкүн:- Аягына чыга элек (uncompleted)
- Жыйынтык менен аяктады (completed with a value)
- Катасы менен аяктады (completed with an error)
Futureбүтүшүн иштетүүthen(),catchError(),whenComplete()жеawaitаркылуу жүргүзүлөт. -
Stream<T>классы: Асинхрондук окуялардын тизмеси. Бул маалымат агымдарын иштетүү үчүн колдонулат, мисалы, файлдан окуу, тармак аркылуу маалымат алуу, колдонуучу интерфейсинин окуялары. Агым бир жолу (single-subscription) же көп жолу (broadcast) болушу мүмкүн. Окуяларды иштетүүlisten(),async*,yieldаркылуу жүргүзүлөт.Stream<int> countStream(int to) async* { for (int i = 1; i <= to; i++) { await Future.delayed(Duration(seconds: 1)); yield i; // Агымга маанини жиберүү } } void main() { Stream<int> stream = countStream(3); stream.listen( (data) => print('Алып келинди: $data'), onError: (error) => print('Ката: $error'), onDone: () => print('Агым аяктады'), ); }
Дартта асинхрондуулук "бир гана окуялык цикл" (event loop) моделине негизделген. Негизги агым кодду сапаттуу аткарат, бирок асинхрондук операцияга туш келгенде (мисалы, await же Future.then), ал "окуялар кезеги" (event queue) өткөрүлүп, кийинки коддун аткарылышын улантат. Асинхрондук операция аяктагандан кийин, анын жыйынтыгы кайра "окуялар кезегине" кайтарылат. Окуялар цикли үзгүлтүксүз "окуялар кезегин" текшерип, негизги агым бош болсо, тапшырмаларды аткарат.