Scope, korutinanın ləğv edilməsini necə izləyir?
sobes.tech Süni İntellekt
AI-dan cavab
Scope, Job obyektindən istifadə edərək korutinanın ləğvini izləyir. Hər CoroutineScope ilə əlaqəli Job var.
Bir CoroutineScope daxilində yeni korutina yaradıldıqda, ona bu scope-un Job-u valideyn Job kimi verilir.
Ləğv etmənin izlənməsi mexanizmi aşağıdakı kimi işləyir:
- Scope-un ləğvi: Scope-un
Job-undacancel()çağırıldıqda, bu, rekursiv olaraq bütün uşaqlarJob-larını ləğv edir. - Uşaq Korutinasının ləğvi: Uşaq korutinası (məsələn,
withContext(NonCancellable)vasitəsilə) və ya idarə olunmayan istisna baş verdikdə, bu, özJob-una məlumat verir. ValideynJob-u (scope-un) isə digər uşaq korutinasını ləğv edə bilər. - Kooperativ Ləğv: Korutinalar kooperativ olmalıdır. Bu, korutina daxilində kodun mütəmadi olaraq ləğv olunub-olunmadığını yoxlaması və düzgün işləməsini təmin etməsi deməkdir. Suspend funksiyalar (məsələn,
delay, I/O əməliyyatları) avtomatik olaraqJob-un vəziyyətini yoxlayır.
Kod, isActive və ya ensureActive() istifadə edərək ləğvi açıq şəkildə yoxlaya bilər:
// Korutinanın aktivliyini yoxlama nümunəsi
suspend fun fetchData() = coroutineScope {
launch {
while (isActive) {
// Uzun müddətli əməliyyat yerinə yetir
delay(100) // dayandırma nöqtəsi - avtomatik ləğv yoxlaması
// və ya açıq şəkildə yoxlama
if (!isActive) {
break // ləğv zamanı döngüdən çıx
}
}
println("fetchData korutinası tamamlandı")
}
}
ensureActive() istifadə edildikdə, ləğv zamanı CancellationException atılır:
// ensureActive() istifadə nümunəsi
suspend fun processData() {
// ... bəzi işlər ...
ensureActive() // Korutina ləğv olunarsa, CancellationException atacaq
// ... yalnız korutina aktivdirsə davam et ...
}
CancellationException standart ləğv siqnalını yaymaq üçün istifadə olunan yoldur. Bu, korutinaların ləğv edilməsində səhv kimi qəbul edilməməlidir.
Scope, Job-u ilə, "valideyn-uşaq" Job hierarxiyası yaradır ki, bu da valideyn Job-dan uşaqlara ləğv siqnalının yayılmasına imkan verir. Bu, strukturlaşdırılmış paralelliyin əsasını təşkil edir.