Sobes.tech
Middle

Scope, coroutine iptalini nasıl izler?

sobes.tech yapay zeka

AI'dan gelen yanıt

Scope, Job nesnesi aracılığıyla bir coroutine iptalini izler. Her CoroutineScope ile ilişkili bir Job vardır.

Bir CoroutineScope içinde yeni bir coroutine oluşturulduğunda, bu coroutine, bu scope'un Job'unu ebeveyn Job olarak alır.

İptal izleme mekanizması şu şekilde çalışır:

  1. Scope İptali: Scope'un Job'unda cancel() çağrıldığında, bu işlem tüm alt Job'larıyla birlikte onları da iptal eder.
  2. Alt Coroutine İptali: Bir alt coroutine (örneğin, withContext(NonCancellable) kullanılarak) iptal edildiğinde veya işlenmemiş bir istisna oluştuğunda, bu coroutine, ebeveyn Job'una bilgi verir. Ebeveyn Job (scope'un) ise diğer alt coroutine'larını iptal edebilir.
  3. Kooperatif İptal: Koroutinler, kooperatif olmalı ve iptale karşı durmalı. Bu, coroutine içindeki kodun, iptal edilip edilmediğini düzenli olarak kontrol etmesi anlamına gelir, böylece işi düzgün şekilde sonlandırabilir. delay, I/O işlemleri gibi suspend fonksiyonlar, Job durumunu otomatik olarak kontrol eder.

Kod, isActive veya ensureActive() kullanarak iptali açıkça kontrol edebilir:

// Bir coroutine'in etkinliğinin kontrolü örneği
suspend fun fetchData() = coroutineScope {
    launch {
        while (isActive) {
            // Uzun süren bir işlem yap
            delay(100) // askıya alma noktası - otomatik olarak iptali kontrol eder

            // Veya açıkça kontrol et
            if (!isActive) {
                break // iptal durumunda döngüden çık
            }
        }
        println("fetchData coroutine tamamlandı")
    }
}

ensureActive() kullanımı, iptal durumunda CancellationException fırlatır:

// ensureActive() kullanımı
suspend fun processData() {
    // ... bazı işler ...
    ensureActive() // Coroutine iptal edilirse CancellationException fırlatır
    // ... sadece coroutine aktifse devam et ...
}

CancellationException, iptal sinyalini iletmek için standart yoldur. Bu, coroutine iptali bağlamında bir hata olarak görülmemelidir.

Scope, Job'u sahip olarak, Job'lar arasında "ebeveyn-çocuk" hiyerarşisi oluşturur ve bu, ebeveyn Job'dan çocuk Joblara iptal sinyalinin yayılmasını sağlar. Bu, koroutinlerde yapılandırılmış paralelliğin temelidir.