0Pricing
Kotlin Academy · Ders

Koroutin Hiyerarşilerinde İptal Yayılımı

İptalin üst-ast koroutin ilişkileri boyunca nasıl yayıldığını anlayın.

Koroutin Hiyerarşilerinde İptal Yayılımı, CoddyKit'te ücretsiz bir Kotlin Academy dersidir. Bu, 4 dersinin 4. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Kotlin Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Kotlin Academy kursu toplamda 4 dersten oluşur.

Üst Öğe-Alt Öğe İlişkisi

Bir korutin launch ile başka bir korutin başlattığında, alt korutin üst öğenin Job'ına katılır. Üst öğenin iptal edilmesi tüm alt öğeleri iptal eder.

import kotlinx.coroutines.*
fun main() = runBlocking {
    val parent = launch {
        launch { delay(1000); println("child 1") }
        launch { delay(1000); println("child 2") }
        delay(1000)
        println("parent")
    }
    delay(50)
    parent.cancel()
    parent.join()
    println("All cancelled")
}

Alt Öğedeki Hata Üst Öğeyi İptal Eder

Bir alt öğe iptal kaynaklı olmayan bir istisna fırlatırsa üst öğeyi ve tüm kardeşleri iptal eder — bu, varsayılan Job davranışıdır.

import kotlinx.coroutines.*
fun main() = runBlocking {
    try {
        coroutineScope {
            launch {
                delay(50)
                throw RuntimeException("child failed")
            }
            launch {
                delay(1000)
                println("sibling — never prints")
            }
        }
    } catch (e: RuntimeException) {
        println("Caught: ${e.message}")
    }
}

İptal Yukarı Doğru Yayılmaz

Bir alt öğenin iptal edilmesi üst öğeyi İPTAL ETMEZ. Bunu yalnızca işlenmemiş istisnalar yapar. Üst öğe bir alt öğeyi istediği zaman iptal edebilir.

import kotlinx.coroutines.*
fun main() = runBlocking {
    val parent = launch {
        val child = launch {
            delay(1000)
            println("child done")
        }
        delay(50)
        child.cancel()  // cancels child
        child.join()
        println("parent still running")  // parent is fine
    }
    parent.join()
}

coroutineScope ve GlobalScope

coroutineScope bir alt kapsam oluşturur: iptal ve hatalar yayılır. GlobalScope, üst öğesi olmayan yetim korutinler oluşturur — üretim ortamında bundan kaçının.

import kotlinx.coroutines.*
fun main() = runBlocking {
    try {
        coroutineScope {
            launch { delay(50); throw RuntimeException("error") }
        }
    } catch (e: Exception) {
        println("coroutineScope propagated: ${e.message}")
    }
    // GlobalScope.launch { } would NOT propagate to runBlocking
}

Bir Alt Ağacı İptal Etme

Her launch veya async bir Job döndürür. İç içe başlatılanlar da dâhil olmak üzere tüm alt ağacı iptal etmek için bir işi iptal edin.

import kotlinx.coroutines.*
fun main() = runBlocking {
    val root = launch {
        launch {
            launch { delay(1000); println("deep") }
            delay(1000)
        }
    }
    delay(50)
    root.cancel()
    root.join()
    println("Whole subtree cancelled")
}

cancel() Sonrasında join()

Devam etmeden önce korutinin ve alt öğelerinin tamamen durmasını beklemek için cancel() sonrasında her zaman join() çağırın.

import kotlinx.coroutines.*
fun main() = runBlocking {
    val job = launch {
        try { delay(1000) }
        finally { println("cleanup ran") }
    }
    delay(50)
    job.cancel()
    job.join()  // waits for finally to complete
    println("Proceeded after join")
}

cancelAndJoin()

job.cancelAndJoin(), iptal edip ardından katılma işlemini gerçekleştirerek cancel() + join() ile eşdeğer olan kullanışlı bir yardımcıdır.

import kotlinx.coroutines.*
fun main() = runBlocking {
    val job = launch {
        try { delay(1000) }
        finally { println("cleanup") }
    }
    delay(50)
    job.cancelAndJoin()  // cancel + join in one call
    println("Done")
}

async Üzerinden Yayılım

async ile istisnalar Deferred içinde saklanır ve await() çağrıldığında fırlatılır. İşlenmezlerse yine de üst öğeye yayılırlar.

import kotlinx.coroutines.*
fun main() = runBlocking {
    try {
        coroutineScope {
            val d = async { throw RuntimeException("async fail") }
            d.await()  // rethrows here
        }
    } catch (e: RuntimeException) {
        println("Caught from async: ${e.message}")
    }
}

Yapılandırılmış Eşzamanlılık Güvencesi

Yapılandırılmış eşzamanlılık, bir kapsam tamamlandığında tüm alt öğelerinin de tamamlanmış olmasını garanti eder. Hiçbir korutin sızıntısı oluşmaz — korutinler ya tamamlanır ya da iptal edilir.

import kotlinx.coroutines.*
suspend fun doWork() = coroutineScope {
    launch { delay(100); println("work 1") }
    launch { delay(200); println("work 2") }
    // both children complete before doWork returns
}
fun main() = runBlocking {
    doWork()
    println("All work done")
}

İptal Yayılımı Diyagramı

Hiyerarşi: üst öğe iptali → tüm alt öğeler iptal edilir. Alt öğe iptali → yalnızca o alt ağaç etkilenir. Alt öğe istisnası → üst öğe iptal edilir → kardeşler iptal edilir.

import kotlinx.coroutines.*
fun main() = runBlocking {
    // Parent
    launch {
        val c1 = launch { delay(1000); println("c1") }  // child 1
        val c2 = launch { delay(1000); println("c2") }  // child 2
        delay(50)
        c1.cancel()  // only c1 cancelled
        c1.join()
        println("c2 still active: ${c2.isActive}")
        c2.cancelAndJoin()
    }.join()
}

Android'de CoroutineScope Yaşam Döngüsü

Android'de viewModelScope, ViewModel temizlendiğinde iptal edilir. Başlatılan tüm korutinler otomatik olarak iptal edilir — elle temizlik gerekmez.

import kotlinx.coroutines.*
// Pseudocode:
// class MyViewModel : ViewModel() {
//     fun load() = viewModelScope.launch {
//         val data = repo.fetch() // cancelled if VM cleared
//         _state.value = data
//     }
// }
fun main() = runBlocking { println("viewModelScope cancels on ViewModel.onCleared()") }

Hızlı Kontrol

Normal bir Job altında bir alt öğe işlenmemiş bir istisna fırlattığında kardeş korutinlere ne olur?

Özet

Üst öğenin iptali tüm alt öğelere yayılır. Alt öğedeki hata üst öğeye ve kardeşlere yayılır (normal Job ile). Temiz bir sonlandırma için cancelAndJoin() kullanın. Yapılandırılmış eşzamanlılık, korutin sızıntısı olmamasını sağlar.

Sıkça Sorulan Sorular

“Koroutin Hiyerarşilerinde İptal Yayılımı” dersi ücretsiz mi?

Evet — “Koroutin Hiyerarşilerinde İptal Yayılımı” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Kotlin Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Kotlin Academy kursu toplamda 4 dersten oluşur.

“Koroutin Hiyerarşilerinde İptal Yayılımı” dersinde ne öğreneceğim?

İptalin üst-ast koroutin ilişkileri boyunca nasıl yayıldığını anlayın. Kotlin Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

Kotlin Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te Kotlin Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 4. dersidir.

“Koroutin Hiyerarşilerinde İptal Yayılımı” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu Kotlin Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her Kotlin Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. İş Birlikli İptal: isActive ve ensureActive
  2. withTimeout ve withTimeoutOrNull
  3. finally ve NonCancellable ile Temizleme
  4. Koroutin Hiyerarşilerinde İptal Yayılımı
← Kotlin Academy Sayfasına Dön