Kotlin Academy · पाठ

Coroutine Hierarchies में Cancellation Propagation

समझें कि parent-child coroutine relationships में cancellation कैसे प्रवाहित होता है।

पाठ 4, कुल 4 में से13 चरण

Coroutine Hierarchies में Cancellation Propagation, CoddyKit पर Kotlin Academy का एक निःशुल्क पाठ है। यह 4 में से 4वाँ पाठ है। इस अध्ययन पथ के 3 तक कोई भी पाठ पूरा पढ़ना निःशुल्क है — इसके बाद CoddyKit PRO हर पाठ अनलॉक करता है, साथ ही अंतर्निर्मित कोड संपादक और चौबीसों घंटे एआई शिक्षक के साथ व्यावहारिक अभ्यास भी उपलब्ध कराता है। यह Kotlin Academy सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। Kotlin Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

अभिभावक-बाल संबंध

जब कोई कोरूटीन launch के साथ दूसरी कोरूटीन शुरू करती है, तो बाल कोरूटीन अभिभावक के Job में शामिल हो जाती है। अभिभावक को रद्द करने पर सभी बाल कोरूटीन रद्द हो जाती हैं।

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")
}

बाल विफलता अभिभावक को रद्द करती है

यदि कोई बाल कोरूटीन रद्दीकरण से अलग अपवाद उछालती है, तो वह अभिभावक और सभी सह-बाल कोरूटीन को रद्द कर देती है—यह डिफ़ॉल्ट Job व्यवहार है।

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}")
    }
}

रद्दीकरण ऊपर की ओर प्रसारित नहीं होता

बाल कोरूटीन का रद्दीकरण अभिभावक को रद्द नहीं करता। केवल बिना संभाले गए अपवाद ही ऐसा करते हैं। अभिभावक अपनी इच्छा से बाल कोरूटीन को रद्द कर सकता है।

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 बनाम GlobalScope

coroutineScope एक बाल दायरा बनाता है: रद्दीकरण और त्रुटियाँ प्रसारित होती हैं। GlobalScope बिना अभिभावक वाली अनाथ कोरूटीन बनाता है—उत्पादन परिवेश में इससे बचें।

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
}

उपवृक्ष को रद्द करना

हर launch या async एक Job लौटाता है। किसी कार्य को रद्द करने पर उसका पूरा उपवृक्ष, जिसमें अंदर शुरू की गई कोरूटीन भी शामिल हैं, रद्द हो जाता है।

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() के बाद join()

आगे बढ़ने से पहले कोरूटीन और उसकी बाल कोरूटीन के पूरी तरह रुकने की प्रतीक्षा करने के लिए cancel() के बाद हमेशा join() कॉल करें।

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() एक सुविधाजनक तरीका है जो पहले रद्द करता है और फिर जुड़ता है; यह cancel() + join() के बराबर है।

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 के माध्यम से प्रसार

async के साथ, अपवाद Deferred में संग्रहीत होते हैं और await() कॉल करने पर उछाले जाते हैं। यदि उन्हें संभाला न जाए, तो वे फिर भी अभिभावक तक प्रसारित होते हैं।

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}")
    }
}

संरचित समवर्तीता की गारंटी

संरचित समवर्तीता यह सुनिश्चित करती है कि जब कोई दायरा समाप्त हो, तो उसकी सभी बाल कोरूटीन समाप्त हो चुकी हों। कोई कोरूटीन लीक नहीं होती—या तो वे पूरी होती हैं या रद्द कर दी जाती हैं।

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")
}

रद्दीकरण प्रसार आरेख

पदानुक्रम: अभिभावक रद्द → सभी बाल रद्द। बाल रद्द → केवल उसका उपवृक्ष। बाल अपवाद → अभिभावक रद्द → सह-बाल रद्द।

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()
}

एंड्रॉइड में CoroutineScope का जीवनचक्र

एंड्रॉइड में, ViewModel साफ़ किए जाने पर viewModelScope रद्द हो जाता है। शुरू की गई सभी कोरूटीन अपने-आप रद्द हो जाती हैं—मैन्युअल सफ़ाई की आवश्यकता नहीं होती।

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()") }

त्वरित जाँच

सामान्य Job के अंतर्गत किसी बाल कोरूटीन द्वारा बिना संभाला गया अपवाद उछालने पर सह-बाल कोरूटीन के साथ क्या होता है?

पुनरावलोकन

अभिभावक का रद्दीकरण सभी बाल कोरूटीन तक पहुँचता है। बाल विफलता अभिभावक और सह-बाल कोरूटीन तक प्रसारित होती है, जब सामान्य Job का उपयोग किया जाता है। साफ़-सुथरे समापन के लिए cancelAndJoin() का उपयोग करें। संरचित समवर्तीता सुनिश्चित करती है कि कोई कोरूटीन लीक न हो।

शुरुआत निःशुल्क

एआई शिक्षक के साथ Kotlin सीखें — निःशुल्क

अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।

पाठ्यक्रम
51
पाठ
203

अक्सर पूछे जाने वाले प्रश्न

क्या “Coroutine Hierarchies में Cancellation Propagation” पाठ निःशुल्क है?

हाँ — Kotlin Academy अध्ययन पथ के 3 तक कोई भी पाठ, जिसमें “Coroutine Hierarchies में Cancellation Propagation” भी शामिल है, यहाँ वेब पर पूरा पढ़ना निःशुल्क है। इसके बाद CoddyKit PRO हर पाठ अनलॉक करता है, साथ ही अंतर्निर्मित कोड संपादक और चौबीसों घंटे एआई शिक्षक के साथ इंटरैक्टिव अभ्यास भी उपलब्ध कराता है। Kotlin Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

“Coroutine Hierarchies में Cancellation Propagation” में मैं क्या सीखूँगा?

समझें कि parent-child coroutine relationships में cancellation कैसे प्रवाहित होता है। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ Kotlin Academy का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।

क्या Kotlin Academy शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?

पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर Kotlin Academy शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 4वाँ पाठ है।

“Coroutine Hierarchies में Cancellation Propagation” पाठ पूरा करने में कितना समय लगता है?

CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।

क्या मैं इस Kotlin Academy पाठ में कोड लिख और चला सकता हूँ?

हाँ। हर Kotlin Academy पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।

इस पाठ्यक्रम के सभी पाठ

  1. Cooperative Cancellation: isActive और ensureActive
  2. withTimeout और withTimeoutOrNull
  3. finally और NonCancellable से Cleanup
  4. Coroutine Hierarchies में Cancellation Propagation
← Kotlin Academy पर वापस जाएँ