← Back to Kotlin Course | Chapter 12: Coroutines | Lesson 6 of 7

Channels के Basics

एक Channel एक pipe जैसा है जो एक coroutine को इसके ज़रिए items भेजने देता है जबकि दूसरा coroutine दूसरे छोर पर उन्हें उठाता है।
Syntax
kotlin
val channel = Channel<Type>()

launch { channel.send(value); channel.close() }   // producer

for (value in channel) {                          // consumer
    // use value until closed
}

Creating and Using a Channel

एक Channel<T> coroutines के बीच एक pipe की तरह काम करता है: एक side send() call करके एक value अंदर push करता है, जबकि दूसरा receive() call करके इसे बाहर खींचता है।

Warning:
  • यह उदाहरण kotlinx.coroutines उपयोग करता है, जो साधारण Kotlin standard library का हिस्सा नहीं है।
  • इसे compile और run करने के लिए kotlinx-coroutines-core dependency (Gradle/Maven के ज़रिए जोड़ी गई) चाहिए।

उदाहरण: Creating and Using a Channel

markup
import kotlinx.coroutines.*
import kotlinx.coroutines.channels.*

fun main() = runBlocking {
    val channel = Channel<Int>()
    launch {
        channel.send(42)
    }
    println("Received: ${channel.receive()}")
}

Iterating Over a Channel

एक for loop किसी channel को भेजे गए हर value को तब तक consume कर सकता है जब तक channel बंद न हो जाए, जिस बिंदु पर loop स्वाभाविक रूप से खत्म हो जाता है।

Warning:
  • यह उदाहरण kotlinx.coroutines उपयोग करता है, जो साधारण Kotlin standard library का हिस्सा नहीं है।
  • इसे compile और run करने के लिए kotlinx-coroutines-core dependency (Gradle/Maven के ज़रिए जोड़ी गई) चाहिए।

उदाहरण: Iterating Over a Channel

markup
import kotlinx.coroutines.*
import kotlinx.coroutines.channels.*

fun main() = runBlocking {
    val channel = Channel<Int>()
    launch {
        for (i in 1..3) {
            channel.send(i)
        }
        channel.close()
    }
    for (value in channel) {
        println("Got: $value")
    }
}

Closing a Channel

किसी channel पर close() call करना signal देता है कि अब कोई values नहीं भेजी जाएंगी, जो for loop से इसे iterate करने वाले किसी भी code को अनिश्चित काल तक इंतज़ार करने के बजाय साफ़ तरीके से खत्म होने देता है।

Warning:
  • यह उदाहरण kotlinx.coroutines उपयोग करता है, जो साधारण Kotlin standard library का हिस्सा नहीं है।
  • इसे compile और run करने के लिए kotlinx-coroutines-core dependency (Gradle/Maven के ज़रिए जोड़ी गई) चाहिए।

उदाहरण: Closing a Channel

markup
import kotlinx.coroutines.*
import kotlinx.coroutines.channels.*

fun main() = runBlocking {
    val channel = Channel<String>()
    launch {
        channel.send("done")
        channel.close()
    }
    for (msg in channel) {
        println("Message: $msg")
    }
    println("Channel fully drained")
}

Channels vs Flow

एक channel एक hot pipe है -- भेजी गई हर value एक receiver द्वारा बिल्कुल एक बार consume होती है -- जबकि एक Flow cold है और इसे शुरू से, ज़रूरत जितनी बार, ताज़ा collect किया जा सकता है।

Warning:
  • यह उदाहरण kotlinx.coroutines उपयोग करता है, जो साधारण Kotlin standard library का हिस्सा नहीं है।
  • इसे compile और run करने के लिए kotlinx-coroutines-core dependency (Gradle/Maven के ज़रिए जोड़ी गई) चाहिए।

उदाहरण: Channels vs Flow

markup
import kotlinx.coroutines.*
import kotlinx.coroutines.channels.*

fun main() = runBlocking {
    val channel = Channel<Int>(3)
    channel.send(1)
    channel.send(2)
    channel.close()
    var sum = 0
    for (v in channel) sum += v
    println("Sum from channel: $sum")
}
Related Topics
{# common_mistakes/chapter_summary/browser_support: on Hindi pages the view already swaps in the hi_ translation fields (or blanks these out if untranslated), so this renders correctly for both languages without a lang_code check here. #}
आम गलतियां
  1. किसी channel को close() करना भूल जाना जब कोई और values नहीं भेजी जाएंगी, जो किसी receiver को channel पर for के साथ हमेशा के लिए इंतज़ार करता छोड़ सकता है।
  2. भरे हुए buffer/बिना buffer वाले channel को send (या इससे receive) करना यह समझे बिना कि वह operation तब तक suspend करता है जब तक दूसरा पक्ष तैयार न हो।
  3. किसी Channel (coroutines के बीच एक communication pipe) को किसी Flow (एक cold, restartable stream) के साथ confuse करना -- channels hot और single-run हैं।
चैप्टर सारांश
  • Channel<T>() एक communication pipe बनाता है जिसमें एक coroutine send() से values भेज सकता है जबकि दूसरा उन्हें receive() करता है।
  • एक for loop बंद होने तक सीधे किसी channel की values पर iterate कर सकता है।
  • close() signal देता है कि अब कोई values नहीं भेजी जाएंगी, receivers को साफ़ तरीके से iterate करना खत्म करने देते हुए।
  • Channels hot हैं -- भेजी गई values receive होने के बाद चली जाती हैं, एक Flow के विपरीत जिसे बार-बार collect किया जा सकता है।
🔒

Chapter Quiz — Complete all 7 topics to unlock

0/7 topics done

Complete these topics first:

Login to run this code

C/C++/Java/PHP execution requires a free account. Your code is saved — you'll land right back in the editor after logging in.