Async ve await mekanizmaları nasıl çalışır?
sobes.tech yapay zeka
AI'dan gelen yanıt
Swift'te Async/await, yapılandırılmış eşzamanlılığa dayanır ve Dispatch/Global Actors kullanır. Arka planda çalışan mekanizmalar şunlardır:
-
Continuation Stili: Asenkron fonksiyonlar, devamlar stiliyle derlenir. Anında bir değer döndürmek yerine, kontrol Swift çalışma zamanına aktarılır ve fonksiyonun mevcut durumu (yerel değişkenler, yürütme göstergesi) saklanır. Asenkron işlem tamamlandığında, çalışma zamanı fonksiyonun yürütmesini kaydedilen durumdan devam ettirir.
-
Görev: Her
asyncfonksiyon çağrısı, yapılandırılmış birTaskoluşturur veya ona katılır.Task, bir çalışma birimini temsil eder ve bir hiyerarşi oluşturur. AnaTask, altTask'ların tamamlanmasını bekler. -
İş:
Task, daha küçük iş birimlerine, yaniJob'lara bölünür. BirJob, bir yürütücüde çalıştırılabilecek bir kod parçasını temsil eder. -
Yürütücü: Yürütücü,
Job'u başlatmaktan sorumludur. Standart kütüphane, çoğu asenkron görev için küreselDispatchQueue'ları yürütücü olarak kullanır. Belirli bağlamlar (örneğin,MainActor) kendi özel yürütücüleriyle gelir. -
Askıya Alma Noktaları:
await, askıya alma noktasıdır. Bu noktaya gelindiğinde, fonksiyon askıya alınır, kontrol çağıran kod veya yürütücüye aktarılır ve mevcutJobsona erer. Swift çalışma zamanı fonksiyonun durumunu saklar. -
Devam:
awaitile beklenen asenkron işlem tamamlandığında, Swift çalışma zamanı yeni birJoboluşturur ve askıya alınmış fonksiyonun yürütmesine devam eder. BuJob, yürütücü kuyruğuna konur. -
İptal: Yapılandırılmış eşzamanlılık, hiyerarşik iptali destekler. Bir ana
Task'ın iptali, otomatik olarak tüm altTask'larını iptal eder. Asenkron işlemler, iptal durumunu kontrol edebilir ve uygun şekilde tepki verebilir.
İşte, bir async fonksiyonun derlenmesine ilişkin basitleştirilmiş bir örnek:
// Orijinal async fonksiyon
func fetchData() async -> Data {
// Asenkron işlem
let data = await URLSession.shared.data(from: url).0
return data
}
// Derlemenin basitleştirilmiş temsili
// Döndürmek yerine, fonksiyon bir Continuation alır
func fetchData(_ continuation: Continuation<Data, Error>) {
// Fonksiyonun başlangıç kodu
let url = URL(string: "...")! // Örnek
// Asenkron işlemi başlat
URLSession.shared.data(from: url) { data, _, error in
// Bu kapanış, asenkron işlemin tamamlanmasından sonra çalışır
if let data = data {
// Sonucu continuation'a ilet, fonksiyonu yeniden başlat
continuation.resume(returning: data)
} else if let error = error {
continuation.resume(throwing: error)
} else {
// Diğer durumların işlenmesi
continuation.resume(throwing: NSError(domain: "", code: 0, userInfo: nil))
}
}
// Fonksiyon burada sona erer, resume çağrısını bekler
}
Await, temelde, Continuation yönetimi ve Job planlaması üzerinde sözdizimi şekeridir. Askıya alma, doğrudan akışı engellemez, bunun yerine yürütücüye diğer Job'ları yürütmesine izin verir.