Coroutine Builder: bu nədir, koryutin builderlarının növləri və necə işləyir

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

Coroutine Builder — Kotlin Coroutines funksiyalarıdır ki, koryutinlər yaradır və işə salır, onların icra üsulunu müəyyən edir. launch, async, runBlocking və produce builder-ləri müxtəlif ssenariləri əhatə edir: fon tapşırıqlarından nəticə qaytaran paralel hesablamalara qədər. JetBrains, 2024 məlumatlarına görə, Coroutine Builder koryutin modelinin əsasını təşkil edir, strukturlaşdırılmış konkurrentlik və həyat dövrünün idarə edilməsini təmin edir.

Əsas məqamlar

  • Coroutine Builder — müəyyən CoroutineScope-da koryutin yaradan funksiya
  • launch — nəticə qaytarmadan koryutin işə salır, Job obyekti qaytarır
  • async — Deferred qaytaran koryutin işə salır, await() vasitəsilə nəticə əldə etməyə imkan verir
  • runBlocking — cari thread-i bloklayır, blocking və suspending kod arasında körpü kimi istifadə olunur
  • produce — məlumatların axın ötürülməsi üçün kanallı koryutin yaradır (Flow lehinə köhnəlmişdir)

Coroutine Builder nədir?

Coroutine Builder — CoroutineScope və suspend-blok qəbul edən, yeni koryutin yaradıb işə salan Kotlin genişləndirmə funksiyasıdır. Hər bir builder koryutinin necə icra olunacağını müəyyən edir: nəticə ilə və ya nəticəsiz, thread-i bloklamaqla və ya asinxron şəkildə. Builder-lər dildə koryutin modelinə giriş nöqtələridir.

Bütün builder-lər uşaq koryutinlərin həyat dövrünü idarə edən CoroutineScope vasitəsilə işləyir. Scope ləğv edildikdə onun vasitəsilə işə salınmış bütün koryutinlər avtomatik ləğv edilir — bu strukturlaşdırılmış konkurrentlik prinsipidir. Bu yanaşma koryutin sızmalarının qarşısını alır və proqnozlaşdırıla bilən tamamlanmanı təmin edir.

kotlin
import kotlinx.coroutines.*

fun main() = runBlocking {
    // Builder-lər CoroutineScope daxilində işləyir
    val job = launch {
        delay(1000L)
        println("Dünya!")
    }
    println("Salam,")
    job.join()
}

Koryutin builderlarının əsas növləri

Kotlin dörd daxili koryutin builder-i təqdim edir: launch, async, runBlockingproduce. Onların hər birinin öz qaytarılan tipi və tətbiq sahəsi var. Android mobil inkişafı üçün əsas olanlar launch və async-dir — onlar bloklamayan şəkildə işləyir və memarlıq komponentləri ilə inteqrasiya olunur.

BuilderQaytarılan tipThread bloklanmasıSsenari
launchJobXeyrFire-and-forget tapşırıqları
asyncDeferred<T>XeyrParalel hesablamalar
runBlockingTBəliTestlər, main funksiyası
produceReceiveChannel<E>XeyrAxın ötürülməsi (deprecated)

Hər bir builder əlavə parametrlər qəbul edir: CoroutineStart (işə salma strategiyası), CoroutineContext (dispetçer, istisnalar) və adlandırılmış kod bloku. Varsayılan olaraq koryutin dərhal işə salınır (CoroutineStart.DEFAULT).

launch: fire-and-forget işə salma

launch — Android inkişafında ən çox istifadə olunan builder-dir. Nəticə qaytarmayan koryutin işə salır və onun həyat dövrünü idarə etmək üçün Job obyekti qaytarır. Bu, yalnız yan təsirin lazım olduğu əməliyyatlar üçün ideal seçimdir: DB-yə yazma, analitika göndərmə, UI yeniləmə.

launch sintaksisi və istifadəsi

launch builder-i CoroutineScope, isteğe bağlı CoroutineContext və suspend-blok qəbul edir. Qaytarılan Job koryutini ləğv etməyə, tamamlanmasını gözləməyə və ya statusu yoxlamağa imkan verir.

kotlin
val scope = CoroutineScope(Dispatchers.IO + SupervisorJob())
val job: Job = scope.launch(CoroutineStart.LAZY) {
    val data = fetchFromNetwork()
    saveToDatabase(data)
}
job.start()
job.join()

CoroutineStart.LAZY parametri işə salmanı start() və ya join() açıq çağırışına qədər təxirə salır. Bu, gecikmiş inisializasiya və şərti işə salma üçün faydalıdır. Standart dərhal işə salma üçün CoroutineStart.DEFAULT istifadə olunur və ya parametr buraxılır.

async: nəticə ilə paralel hesablamalar

async — Deferred<T> qaytaran builder — nəticənin asinxron vədi. await() çağırışı thread-i bloklamadan nəticə əldə olunana qədər koryutini dayandırır. Bu, Kotlin koryutinlərində paralel tapşırıqlar üçün əsas mexanizmdir.

İki sorğunun paralel işə salınması

async eyni anda bir neçə müstəqil əməliyyat yerinə yetirmək lazım olduqda xüsusilə effektivdir. Suspend-funksiyaların ardıcıl çağırışından fərqli olaraq, async koryutinləri paralel işə salır, ümumi icra müddətini qısaldır.

kotlin
suspend fun fetchUserData(): UserData {
    val deferred1 = CoroutineScope(Dispatchers.IO).async { api.getProfile() }
    val deferred2 = CoroutineScope(Dispatchers.IO).async { api.getSettings() }
    val deferred3 = CoroutineScope(Dispatchers.IO).async { api.getNotifications() }
    return UserData(
        profile = deferred1.await(),
        settings = deferred2.await(),
        notifications = deferred3.await()
    )
}

Deferred Job-dan miras alır, buna görə async həyat dövrünün bütün əməliyyatlarını dəstəkləyir: ləğv etmə, tamamlanmanı gözləmə, istisnaların idarə edilməsi. Scope ləğv edildikdə Deferred uşaq koryutinləri avtomatik ləğv olunur.

runBlocking: blocking dünyasına körpü

runBlocking — koryutin tamamlanana qədər cari thread-i bloklayan yeganə builder-dir. Yeni CoroutineScope yaradır və ötürülən koryutini işə salır, çağıran thread-i bloklayır. main() giriş nöqtələrində, testlərdə və blocking-kodla inteqrasiyada istifadə olunur.

runBlocking nə vaxt zəruridir

runBlocking üç ssenaridə əsaslandırılır: tətbiqin giriş nöqtəsi (main), suspend-funksiyaların vahid testləri və suspend istifadə edilə bilməyən callback-based kitabxanalarla inteqrasiya. Android istehsal kodunda əsas thread-də runBlocking istifadəsi qəti şəkildə tövsiyə edilmir.

kotlin
class CoroutineTest {
    @Test
    fun `test suspend function`() = runBlocking {
        val result = mySuspendFunction()
        assertEquals("expected", result)
    }
}

Testlər üçün runBlocking əvəzinə kotlinx-coroutines-test ilə TestCoroutineDispatcher istifadə etmək tövsiyə olunur — bu, vaxta nəzarəti təmin edir və test mühitində blokadaların qarşısını alır.

Uyğun builder-i necə seçmək

Coroutine Builder seçimi qaytarılan nəticədən və icra ssenarisindən asılıdır. Əməliyyat məlumat qaytarılmasını tələb etmirsə — launch istifadə edin. Asinxron əməliyyatın nəticəsi lazımdırsa — async. runBlocking yalnız bridging üçün tətbiq edin, produce-i isə reaktiv axınlar üçün Flow ilə əvəz edin.

Android üçün praktiki tövsiyələr

Kotlin Coroutines istifadə edən Android layihələrində əsas builder cütü launch və async-dir. launch ViewModel və UseCases-də koryutinləri işə salmaq üçün, async isə şəbəkəyə və ya DB-yə paralel sorğular üçün istifadə olunur. Müasir kitabxanalar (Ktor, Room) artıq suspend-funksiyaları dəstəkləyir ki, bu da async-in birbaşa istifadəsinə ehtiyacı minimuma endirir.

  • launch — fire-and-forget üçün (loqlama, analitika, keşləmə)
  • async — nəticələri birləşdirməklə paralel sorğular üçün
  • runBlocking — yalnız main() və testlərdə (production-da Main-thread-də yox)
  • produce — Flow / SharedFlow / StateFlow ilə əvəz edin

Tez-tez verilən suallar

Kotlin-də launch async-dən nə ilə fərqlənir?

launch Job qaytarır və icra nəticəsini qaytarmır, async isə Deferred<T> — await() vasitəsilə nəticə əldə edilə bilən obyekt qaytarır. launch fire-and-forget əməliyyatları üçün, async — məlumat qaytaran tapşırıqlar üçün istifadə olunur.

Android Activity-də runBlocking istifadə etmək olarmı?

Tövsiyə edilmir. runBlocking əsas thread-də ANR-yə səbəb olur və UI-ni bloklayır. Activity və Fragment daxilində lifecycleScope.launch istifadə edin — bu, blokadalar olmadan daxili həll yoludur.

launch builder-i nə qaytarır?

launch builder-i koryutinin həyat dövrünü idarə etməyə imkan verən Job obyekti qaytarır: ləğv etmək (cancel), tamamlanmanı gözləmək (join), statusu yoxlamaq (isActive, isCompleted, isCancelled).

Kotlin Coroutines-də Deferred nədir?

Deferred<T> — async builder-i tərəfindən qaytarılan nəticənin asinxron vədidir. Job-dan miras alır və nəticə əldə etmək üçün await(), bloklamayan giriş üçün getCompleted() və istisnanı yoxlamaq üçün getCompletionExceptionOrNull() metodlarını əlavə edir.

launch-i gecikmə ilə necə işə salmaq olar?

CoroutineStart.LAZY parametrindən istifadə edin: scope.launch(start = CoroutineStart.LAZY) { ... }. Sonra faktiki işə salma üçün job.start() və ya job.join() çağırın. Bu, gecikmiş inisializasiya və koryutinlərin şərti icrası üçün faydalıdır.

Xülasə

  • Coroutine Builder — icra üsulunu və qaytarılan tipi müəyyən edən koryutin yaratma funksiyası
  • launch — nəticə qaytarmayan tapşırıqlar üçün əsas builder, koryutini idarə etmək üçün Job qaytarır
  • async — paralel hesablamalar üçün builder, nəticənin await() imkanı ilə Deferred qaytarır
  • runBlocking — main() və testlər üçün bloklayan builder, Android əsas thread-də tövsiyə edilmir
  • Strukturlaşdırılmış konkurrentlik scope ləğv edildikdə uşaq koryutinlərin avtomatik ləğvini təmin edir
  • produce köhnəlmişdir — reaktiv məlumat axınları üçün Flow, SharedFlow və ya StateFlow istifadə edin
  • Builder seçimi ssenaridən asılıdır: fire-and-forget → launch, paralel məlumatlar → async, bridging → runBlocking

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