Механизмҳои async ва await дар зери капот чӣ гуна кор мекунанд?
sobes.tech AI
Ҷавоб аз AI
Async/await дар Swift асосан ба асоси ҳамоҳангсозии сохторӣ сохта шудааст ва истифодаи Dispatch/Global Actors-ро дорад. Механизмҳое, ки дар пасзамина кор мекунанд, инҳоянд:
-
Style Continuation: Функсияҳои асинхронӣ ба услуби идомакунӣ компилют мешаванд. Ба ҷои баргардонидани фаврии арзиш, идоракунӣ ба runtime Swift мегузарад, ки ҳолати ҳозираи функсия (пайвандҳои маҳаллӣ, нишондиҳандаи иҷроиш)ро нигоҳ медорад. Вақте ки амалиёти асинхронӣ ба анҷом мерасад, runtime иҷроишро аз ҳолати нигоҳдошташуда такмил медиҳад.
-
Task: Ҳар даъвати
asyncфунксия созиш ё пайваст мешавад баTaskсохторӣ.Taskяк воҳиди корро намояндагӣ мекунад ва hierarchical-ро месозад.Taskпадар интизор аст, киTask-ҳои кӯдакиро ба анҷом расонад. -
Job:
Taskба воҳидҳои хурдтарини кор, киJobном доранд, тақсим мешавад.Jobяк қисмати коди аст, ки метавонад дар иҷрокунанда (Executor) иҷро шавад. -
Executor: Иҷрокунанда масъул аст барои оғоз кардани
Job. Дар китобхонаи стандартӣ,DispatchQueue-и глобалӣ ҳамчун иҷрокунанда барои зиёда аз корҳои асинхронӣ истифода мешаванд. Мавқеъҳои махсус (масалан,MainActor) иҷрокунандаҳои махсус доранд. -
Points of Suspension:
awaitнуқтаи боздошт аст (suspension point). Вақте ки баawaitмерасад, функсия боздошта мешавад, идоракунӣ ба коди даъваткунанда ё иҷрокунанда мегузарад ваJob-и ҳозира ба анҷом мерасад. Runtime Swift ҳолати функсияро нигоҳ медорад. -
Resumption: Вақте ки амалиёти асинхронӣ, ки ба он
awaitинтизор буд, ба анҷом мерасад, runtime SwiftJobнав месозад барои идомаи иҷрои функсияи боздоштшуда. ИнJobба навбат дар иҷрокунанда гузошта мешавад. -
Cancellation: Ҳамоҳангсозии сохторӣ дастгирӣ мекунад, ки hierarchical-ро бекор мекунад. Бекор кардани
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: "...")! // Масалан
// Оғоз кардани амалиёти асинхронӣ
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 аз continuation даъват шавад
}
Await дар асоси як сахтӣ аст, ки назорати Continuation ва нақшаи Job-ро дар иҷрокунанда таъмин мекунад. Боздоштан мустақиман наметавонад ҷараёнро банд кунад, балки иҷозат медиҳад, ки иҷрокунанда дигар Job-ҳоро иҷро кунад.