Async/Await: mahiyyəti, async funksiyaları və await ilə iş

Müəllif: IT Sectr Dərc olunub: 2026-03-16 Oxuma vaxtı: 8 dəq

Async/Await — sinxron üslubda asinxron kod yazmaq üçün açar sözlər cütüdür, Swift-də iOS 13-dən və Kotlin-də korutinlərlə mövcuddur. Apple Swift Documentation, 2026-ya görə, Async/Await callback zəncirini və GCD-ni əvəz edərək asinxron kodu xətti və oxunaqlı edir. async açar sözü funksiyanı asinxron olaraq işarələyir, await isə nəticə alınana qədər onun icrasını dayandırır.

Əsas məqamlar

  • Async/Await — iç-içə callback-lər olmadan asinxron kod üçün sintaktik şəkər
  • async funksiyanı asinxron və dayandırıla bilən olaraq işarələyir
  • await asinxron əməliyyat tamamlanana qədər funksiyanın icrasını dayandırır
  • Task Swift-də kontekstlə yeni asinxron iş vahidi yaradır
  • Structured Concurrency bütün uşaq tapşırıqların valideyndən əvvəl tamamlanmasını təmin edir

Async/Await və asinxron proqramlaşdırma nədir

Async/Await — asinxron kodu sinxron kimi xətti yazmağa imkan verən dil konstruksiyasıdır. Swift-də iOS 13 / macOS 10.15 ilə birlikdə Swift Concurrency frameworku ilə ortaya çıxdı. Kotlin-də async/await kotlinx.coroutines kitabxanası vasitəsilə 1.3 versiyasından etibarən mövcuddur.

Async/await-dan əvvəl asinxron kod callback-lər, GCD və ya RxSwift üzərində qurulurdu. İç-içə callback zəncirleri callback hell-ə — oxuma və debug-u çətinləşdirən dərin iç-içəliyə səbəb olurdu. Async/Await bu problemi həll edir, asinxron funksiyaların await nöqtələrində “dayanmasına” və nəticə alındıqdan sonra bərpa olunmasına imkan verir.

Google (2025) məlumatlarına görə, Kotlin-də async/await istifadəsi asinxron kodun sətir sayını callback yanaşması ilə müqayisədə 40–60% azaldır. Swift-də Swift Concurrency-nin qəbulu 2025-ci ildə nəşr olunan tətbiqlər arasında 68%-ə çatdı. iOS 16 UIKit, SwiftUI və Foundation-da Swift Concurrency dəstəyini əlavə etdi ki, bu da async/await-ı bütün yeni Apple layihələri üçün standart alətə çevirdi.

İş prinsipi: dayandırıla bilən funksiyalar

Async/await-ın iplərdən əsas fərqi — bloklamadan dayandırma. Funksiya await ilə qarşılaşdıqda dayanır, cari ipi digər tapşırıqlar üçün boşaldır. Asinxron əməliyyat tamamlandıqdan sonra funksiya eyni və ya başqa ipdə bərpa olunur. Buna kooperativ multitasking deyilir.

Async/Await necə işləyir: dayandırma və bərpa

Async funksiyası icra vəziyyətlərini idarə edən sonlu avtomat — state machine-ə kompilyasiya olunur. await nöqtəsində kompilyator konteksti (lokal dəyişənlər, qayıdış ünvanı) saxlayır və idarəni runtime-ə ötürür. Nəticə hazır olduqda runtime konteksti bərpa edir və icranı davam etdirir.

Swift-də bu state machine SIL (Swift Intermediate Language) kompilyatoru səviyyəsində həyata keçirilir. Kotlin-də — Continuation Passing Style (CPS) mexanizmi vasitəsilə: hər bir suspend funksiyası gizli Continuation parametri qəbul edir, onun vasitəsilə nəticə qaytarılır. Hər iki yanaşma yaddaş sızması olmadan təhlükəsiz bərpanı təmin edir.

  • Swift — kompilyator async funksiyasını runAsync coroutine frame ilə SIL-ə tərcümə edir
  • Kotlin — hər bir suspend funksiyası Continuation alır və icranı dispatcher-ə həvalə edir
  • Hər iki dil — await zamanı ipi bloklamadan boşaldır
  • İstisnalar — standart mexanizmlərlə (throws / try-catch) ötürülür

Async/Await vs Callback-lər və GCD: yanaşmaların müqayisəsi

Callback yanaşması əməliyyat tamamlandıqdan sonra çağırılan closure-un ötürülməsini tələb edir. Ardıcıl üç sorğuda hər səviyyədə xəta idarəetməsi ilə üç iç-içə səviyyə yaranır. Async/Await eyni üç sorğunu vahid catch bloku ilə üç ardıcıl sətirə çevirir.

GCD (DispatchQueue) callback hell problemini serial növbələr və DispatchGroup vasitəsilə həll edir, lakin çoxsözlü qalır. Sadə bir tapşırıq — user, sonra friends, sonra UI yükləmək — növbələr, qruplar və notify bloklarının yaradılmasını tələb edir. Async/Await eyni tapşırığı bir funksiyada üç sətirlə yerinə yetirir.

AspektCallbackGCDAsync/Await
İç-içəlikDərin (ölüm piramidası)Orta (qruplar+notify)Xətti (düz)
Xəta idarəetməsiHər callback-dəƏl iləVahid (try/catch)
Ləğv etməƏl iləMəhdudTask.cancel()
Thread safetyƏl iləSerial queue vasitəsiləMainActor vasitəsilə

Apple WWDC 2024-ə görə, Swift Concurrency async/await yeni kod üçün tövsiyə olunan yanaşmadır. GCD C kitabxanaları ilə inteqrasiya və spesifik aşağı səviyyəli ip emalı ssenariləri üçün qalır.

Swift Concurrency: Task, TaskGroup və Actor

Task — Swift-də asinxron işin əsas vahididir. Task mövcud aktor kontekstində və ya ixtiyari ipdə yaradılır. Task daxilində await vasitəsilə async funksiyaları çağırmaq olar. TaskGroup bir neçə uşaq tapşırığını paralel işə salmağa və onların nəticələrini toplamağa imkan verir — steroidli DispatchGroup analoqu.

Actor — öz vəziyyətini məlumat yarışlarından qoruyan thread-safe referans tipidir. Kompilyator zəmanət verir ki, aktorun xassələrinə giriş yalnız async çağırışları və ya aktor izolyasiyası daxilində mümkündür. Actor əl blokadaları olmadan paylaşılan dəyişkən vəziyyəti qorumaq üçün serial DispatchQueue-ni əvəz edir.

Structured Concurrency

Structured Concurrency prinsipi deyir: hər bir asinxron tapşırığın valideyni var və valideyn bütün uşaq tapşırıqları tamamlanana qədər bitmir. Əgər tapşırıq A Task { await B() } işə salırsa, A B-ni gözləyir. Bu, tapşırıq sızmalarının qarşısını alır və proqnozlaşdırıla bilən həyat dövrü təmin edir.

Kotlin-də korutinlərlə Async/Await

Kotlin-də async/await coroutines — dilin yüngül ipləri vasitəsilə həyata keçirilir. Funksiya suspend açar sözü ilə işarələnir (Swift async-in analoqu). İşə salmaq üçün launch (at-və-unut) və ya async (nəticə ilə) istifadə olunur. Await async-dən nəticə almaq üçün çağırılır.

Dispatcher korutinanın hansı ip hovuzunda icra olunacağını müəyyən edir: UI üçün Dispatchers.Main, şəbəkə/disk üçün Dispatchers.IO və CPU intensiv tapşırıqlar üçün Dispatchers.Default. Structured Concurrency CoroutineScope vasitəsilə təmin edilir — scope ləğv edildikdə bütün uşaq korutinalar ləğv olunur.

JetBrains (2025) məlumatlarına görə, Google Play-də Android tətbiqlərinin 97%-i kotlinx.coroutines istifadə edir və onların 82%-i şəbəkə sorğuları üçün async/await tətbiq edir. Coroutines Android-də asinxron proqramlaşdırma üçün de-fakto standarta çevrilib. Kotlin Multiplatform da korutinaları dəstəkləyir, Android, iOS və server tərəfində ümumi asinxron koddan istifadəyə imkan verir.

Swift və Kotlin-də Async/Await ilə kod nümunələri

Hər dil üçün iki nümunəyə baxaq: ardıcıl məlumat yükləmə və TaskGroup və ya async/await ilə paralel sorğular.

Swift: ardıcıl async çağırışları

await istifadəçi məlumatları alınana qədər icranı dayandırır, sonra — dostlar alınana qədər. Heç bir iç-içə closure yoxdur.

swift
func loadProfile() async throws -> Profile {
    let user = try await api.fetchUser()
    let friends = try await api.fetchFriends(for: user.id)
    return Profile(user: user, friends: friends)
}

Swift: TaskGroup ilə paralel sorğular

TaskGroup tapşırıqları paralel işə salır və nəticələri massivdə toplayır. Nəticələrin sırası işə salma sırası ilə üst-üstə düşməyə bilər.

swift
func loadParallel() async throws -> [String] {
    await withThrowingTaskGroup(of: String.self) { group in
        group.addTask { try await api.fetchName() }
        group.addTask { try await api.fetchEmail() }
        group.addTask { try await api.fetchAvatar() }
        var results = [String]()
        for try await value in group { results.append(value) }
        return results
    }
}

Kotlin: async/await ilə ardıcıl çağırış

suspend funksiyaları digər suspend funksiyalarını çağıra bilər. Swift analoqu: ardıcıl çağırışlar.

kotlin
suspend fun loadProfile(): Profile {
    val user = api.fetchUser()
    val friends = api.fetchFriends(user.id)
    return Profile(user, friends)
}

Kotlin: async/await ilə paralel sorğular

Kotlin-də paralellik hər sorğu üçün async ilə coroutineScope vasitəsilə əldə edilir.

kotlin
suspend fun loadParallel(): List<String> = coroutineScope {
    val name = async { api.fetchName() }
    val email = async { api.fetchEmail() }
    val avatar = async { api.fetchAvatar() }
    listOf(name.await(), email.await(), avatar.await())
}

Async/Await-in tipik səhvləri və məhdudiyyətləri

Unudulmuş Task { } — asinxron funksiyanı sinxron kontekstdən Task-a bükülmədən çağırmaq olmaz. Swift-də bu kompilyasiya xətası verir. Kotlin-də lifecycleScope və ya viewModelScope vasitəsilə işə salma tələb olunur. Adi funksiyadan suspend funksiyasını çağırmaq cəhdi kompilyasiya olunmayacaq.

Async-in lazımsız istifadəsi

Hər funksiyanı asinxron etmək lazım deyil. CPU intensiv I/O-siz tapşırıqlar async-dən faydalanmır — onları .userInitiated QoS ilə DispatchQueue-da yerinə yetirmək daha yaxşıdır. Async/Await I/O-bound əməliyyatları üçün optimallaşdırılıb: şəbəkə, disk, gözləmə.

.result ilə əsas ipin bloklanması

Əsas ipdə .result istifadəsi (async funksiyasının nəticəsinin sinxron gözlənməsi) bloklanmaya səbəb olur. Swift-də Task.synchronousWait Apple tərəfindən tövsiyə edilmir. Kotlin-də əsas ipdə runBlocking antipattern-dir — lifecycleScope istifadə edin.

Ləğv edərkən Task sızması

Əgər Task sinifin xassəsinə saxlanmırsa, kontekstdən çıxdıqdan sonra ləğv edilir. Swift-də Task scoped-dir — onun həyat dövrü yaradan kontekstə bağlıdır. Uzunmüddətli əməliyyat lazım olduqda Task-ı xassədə saxlayın.

Tez-tez verilən suallar

Async/await DispatchQueue-dən nə ilə fərqlənir?

Async/Await — növbələrin yaradılmasını tələb etməyən dil konstruksiyasıdır. DispatchQueue — ipləri idarə etmək üçün sistem API-sidir. Async/await dil səviyyəsində state machine-ə, GCD isə OS səviyyəsində syscall-a kompilyasiya olunur.

Await ipi bloklayırmı?

Xeyr — await funksiyanı dayandırır, lakin ipi digər tapşırıqlar üçün boşaldır. Əməliyyat tamamlandıqdan sonra funksiya hovuzdan istənilən mövcud ipdə bərpa olunur.

Async tapşırığı ləğv etmək olarmı?

Bəli — Swift-də Task.cancel() və ya Kotlin-də Job.cancel() vasitəsilə. Ləğv Structured Concurrency-ə uyğun olaraq bütün uşaq tapşırıqlara yayılır. Kod ləğv bayrağını Task.isCancelled və ya ensureActive() vasitəsilə yoxlayır.

Swift-də MainActor nədir?

MainActor — xassələri və metodları həmişə əsas ipdə icra olunan aktordur. Funksiyanı @MainActor ilə işarələyərək, UI yeniləmələrinin düzgun ipdə baş verdiyinə zəmanət verirsiniz, DispatchQueue.main.async-i əvəz edir.

Hansı dillərdə async/await var?

Async/Await Swift (iOS 13+), Kotlin (kotlinx.coroutines vasitəsilə), Dart (Flutter), JavaScript/TypeScript, Python, C#, RustGo-da (sintaktik şəkərlə goroutines vasitəsilə) mövcuddur.

Xülasə

  • Async/Await — callback hell olmadan xətti asinxron kod üçün dil konstruksiyası
  • Swift Concurrency Task, TaskGroup, Actor və Structured Concurrency təmin edir
  • Kotlin coroutines suspend funksiyaları, Dispatchers və korutin scope-larından istifadə edir
  • Bloklamadan dayandırma — async/await-ı iplərdən və növbələrdən fərqləndirən əsas xüsusiyyət
  • Structured Concurrency bütün uşaq tapşırıqların valideyndən əvvəl tamamlanmasını təmin edir
  • Async/Await vs GCD — birincisi yeni kod üçün, ikincisi legacy və aşağı səviyyə üçün
  • MainActor Swift-də və Dispatchers.Main Kotlin-də UI ipini fon əməliyyatlarından qoruyur

Açar təslim mobil tətbiq hazırlayacağıq

IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.

Layihəni müzakirə et

Həm də oxuyun