Channels के Basics
In this page:
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 करके इसे बाहर खींचता है।
- यह उदाहरण kotlinx.coroutines उपयोग करता है, जो साधारण Kotlin standard library का हिस्सा नहीं है।
- इसे compile और run करने के लिए kotlinx-coroutines-core dependency (Gradle/Maven के ज़रिए जोड़ी गई) चाहिए।
उदाहरण: Creating and Using a Channel
import kotlinx.coroutines.*
import kotlinx.coroutines.channels.*
fun main() = runBlocking {
val channel = Channel<Int>()
launch {
channel.send(42)
}
println("Received: ${channel.receive()}")
}
Login to try C/C++/Java/PHP code in the editor
Iterating Over a Channel
एक for loop किसी channel को भेजे गए हर value को तब तक consume कर सकता है जब तक channel बंद न हो जाए, जिस बिंदु पर loop स्वाभाविक रूप से खत्म हो जाता है।
- यह उदाहरण kotlinx.coroutines उपयोग करता है, जो साधारण Kotlin standard library का हिस्सा नहीं है।
- इसे compile और run करने के लिए kotlinx-coroutines-core dependency (Gradle/Maven के ज़रिए जोड़ी गई) चाहिए।
उदाहरण: Iterating Over a Channel
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")
}
}
Login to try C/C++/Java/PHP code in the editor
Closing a Channel
किसी channel पर close() call करना signal देता है कि अब कोई values नहीं भेजी जाएंगी, जो for loop से इसे iterate करने वाले किसी भी code को अनिश्चित काल तक इंतज़ार करने के बजाय साफ़ तरीके से खत्म होने देता है।
- यह उदाहरण kotlinx.coroutines उपयोग करता है, जो साधारण Kotlin standard library का हिस्सा नहीं है।
- इसे compile और run करने के लिए kotlinx-coroutines-core dependency (Gradle/Maven के ज़रिए जोड़ी गई) चाहिए।
उदाहरण: Closing a Channel
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")
}
Login to try C/C++/Java/PHP code in the editor
Channels vs Flow
एक channel एक hot pipe है -- भेजी गई हर value एक receiver द्वारा बिल्कुल एक बार consume होती है -- जबकि एक Flow cold है और इसे शुरू से, ज़रूरत जितनी बार, ताज़ा collect किया जा सकता है।
- यह उदाहरण kotlinx.coroutines उपयोग करता है, जो साधारण Kotlin standard library का हिस्सा नहीं है।
- इसे compile और run करने के लिए kotlinx-coroutines-core dependency (Gradle/Maven के ज़रिए जोड़ी गई) चाहिए।
उदाहरण: Channels vs Flow
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")
}
Login to try C/C++/Java/PHP code in the editor
- किसी channel को
close()करना भूल जाना जब कोई और values नहीं भेजी जाएंगी, जो किसी receiver को channel परforके साथ हमेशा के लिए इंतज़ार करता छोड़ सकता है। - भरे हुए buffer/बिना buffer वाले channel को send (या इससे receive) करना यह समझे बिना कि वह operation तब तक suspend करता है जब तक दूसरा पक्ष तैयार न हो।
- किसी
Channel(coroutines के बीच एक communication pipe) को किसीFlow(एक cold, restartable stream) के साथ confuse करना -- channels hot और single-run हैं।
Channel<T>()एक communication pipe बनाता है जिसमें एक coroutinesend()से values भेज सकता है जबकि दूसरा उन्हेंreceive()करता है।- एक
forloop बंद होने तक सीधे किसी 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: