Async жана await механизмдери кандай иштейт?
sobes.tech AI
AIден жооп
Swiftтеги Async/await негизделген структураланган конкуренцияга негизделген жана Dispatch/Global Actors колдонуп жатат. Арткы планда иштеген механизмдер:
-
Улантуу стили: Асимхрондук функциялар улантуу стилине которулат. Тез арада маанини кайтаруу ордуна, башкаруу Swift runtimeка өткөрүлөт, ал функциянын учурдагы абалын сактайт (жергиликтүү өзгөрмөлөр, аткаруу көрсөткүчү). Асимхрондук операция аяктагандан кийин, runtime функцияны сакталган абалдан калыбына келтирет.
-
Task: Ар бир
asyncфункция чакырыгы структураланганTaskтүзөт же ага кошулат.Taskиштин бирдигин көрсөтөт жана хиерархия түзөт. Ата-энеTaskбалдарTask-ларынын аяктоосун күтөт. -
Job:
Taskкичирээк иш бирдиктерине бөлүнөт, аларJobдеп аталат.Jobаткаруучу (Executor) аркылуу аткарылуучу код бөлүгү болуп саналат. -
Executor: Аткаруучу
Job-ду ишке киргизүү үчүн жооптуу. Стандарттык китепканада, көпчүлүк асинхрондук тапшырмалар үчүн глобалдыкDispatchQueueколдонулат. Специализацияланган контексттер (мисалы,MainActor) өзүнүн атайын аткаруучулары бар. -
Тартыш пункттары:
await— бул токтоп турган чекит (suspension point).awaitке жеткенде, функция токтоп калат, башкаруу чакырган кодго же аткаруучуга өтөт, жана учурдагыJobаяктайт. Swift runtime функциянын абалын сактайт. -
Калыбына келтирүү:
awaitкүтүп жаткан асинхрондук операция аяктагандан кийин, Swift runtime жаңыJobтүзөт, токтогон функцияны улантуу үчүн. БулJobаткаруучу кезегине коюлат. -
Болтуроо: Структураланган конкуренция иерархиялык болтурдууну колдойт. Ата-эне
Taskболтурганда, ал автоматтык түрдө бардык балдарTask-ларын да болтурдууга алат. Асимхрондук операциялар болтурдуунун абалын текшере алат жана ылайык жооп кайтара алат.
Мисал катары, async функциянын компиляцияланган жөнөкөй мисалы:
// Баштапкы async функция
func fetchData() async -> Data {
// Асимхрондук операция
let data = await URLSession.shared.data(from: url).0
return data
}
// Компиляциянын жөнөкөй көрүнүшү
// Вертүстү, функция Continuation кабыл алат
func fetchData(_ continuation: Continuation<Data, Error>) {
// Функциянын баштапкы коду
let url = URL(string: "...")! // Мисал
// А asymхрондук операцияны ишке киргизүү
URLSession.shared.data(from: url) { data, _, error in
// Бул блок асинхрондук операция аяктагандан кийин ишке ашат
if let data = data {
// Натыйжаны continuationга өткөрүү, функцияны улантуу
continuation.resume(returning: data)
} else if let error = error {
continuation.resume(throwing: error)
} else {
// Башка учурларды иштетүү
continuation.resume(throwing: NSError(domain: "", code: 0, userInfo: nil))
}
}
// Функция ушул жерден аяктайт, resume чакыруу күтүлүүдө
}
Await негизинен синтаксистик шекер болуп саналат, ал Continuation башкаруу жана Job пландаштыруу үчүн аткаруучуга үстөмдүк кылат. Токтоп калуу түз эле жипти блоктогон эмес, аткаруучу башка Job-дарды ишке ашырууга мүмкүндүк берет.