flowOn और buffer: Context और Backpressure
flowOn से emission context बदलें और backpressure के लिए emissions को buffer करें।
flowOn और buffer: Context और Backpressure, CoddyKit पर Kotlin Academy का एक निःशुल्क पाठ है। यह 4 में से 4वाँ पाठ है। इस अध्ययन पथ के 3 तक कोई भी पाठ पूरा पढ़ना निःशुल्क है — इसके बाद CoddyKit PRO हर पाठ अनलॉक करता है, साथ ही अंतर्निर्मित कोड संपादक और चौबीसों घंटे एआई शिक्षक के साथ व्यावहारिक अभ्यास भी उपलब्ध कराता है। यह Kotlin Academy सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। Kotlin Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
फ़्लो संदर्भ
डिफ़ॉल्ट रूप से, फ़्लो उस कोरूटीन के संदर्भ में चलता है जो collect को कॉल करती है। जब तक आप इसे बदलते नहीं हैं, उत्पादक और उपभोक्ता का डिस्पैचर एक ही होता है।
import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*
fun main() = runBlocking {
flow {
println("emit on: ${Thread.currentThread().name}")
emit(1)
}.collect {
println("collect on: ${Thread.currentThread().name}")
}
}flowOn ऊपरी संदर्भ बदलता है
flowOn(dispatcher) ऊपरी फ़्लो (श्रृंखला में इसके ऊपर का पूरा भाग) को निर्दिष्ट डिस्पैचर पर चलाता है, जबकि संग्रहण कॉल करने वाले के डिस्पैचर पर ही रहता है।
import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*
fun main() = runBlocking {
flow {
println("emit: ${Thread.currentThread().name}")
emit(1)
}.map {
println("map: ${Thread.currentThread().name}")
it * 2
}.flowOn(Dispatchers.Default) // above runs on Default
.collect {
println("collect: ${Thread.currentThread().name}")
}
}श्रृंखला में कई flowOn
आप flowOn का कई बार उपयोग कर सकते हैं। प्रत्येक flowOn अपने ठीक ऊपर के ऑपरेटरों को पिछले flowOn तक प्रभावित करता है।
import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*
fun main() = runBlocking {
flow { emit(1) }
.map { it + 1 }.flowOn(Dispatchers.IO) // map runs on IO
.map { it * 2 }.flowOn(Dispatchers.Default) // this map runs on Default
.collect { println("Result: $it") } // collect on Main (runBlocking)
}पश्च-दबाव की समस्या
जब उत्पादक, संग्रहकर्ता की प्रक्रिया-क्षमता से तेज़ी से उत्सर्जन करता है, तो मान कतार में जमा होने लगते हैं। बफ़रिंग के बिना उत्पादक को प्रतीक्षा करनी पड़ती है।
import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*
fun main() = runBlocking {
val time = System.currentTimeMillis()
flow {
repeat(3) { i ->
delay(100) // fast producer
emit(i)
}
}.collect {
delay(300) // slow consumer
println("Got $it in ${System.currentTimeMillis() - time}ms")
}
}buffer() ऑपरेटर
buffer() उत्पादक और उपभोक्ता को अलग-अलग कोरूटीन में समवर्ती रूप से चलाता है और उत्सर्जित मानों को चैनल में बफ़र करता है। उत्पादक को उपभोक्ता की प्रतीक्षा नहीं करनी पड़ती।
import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*
fun main() = runBlocking {
val time = System.currentTimeMillis()
flow {
repeat(3) { i -> delay(100); emit(i) }
}.buffer() // producer and consumer run concurrently
.collect {
delay(300)
println("Got $it in ${System.currentTimeMillis() - time}ms")
}
}buffer की क्षमता
buffer(capacity) चैनल बफ़र का आकार निर्धारित करता है। बफ़र भर जाने पर उत्पादक सस्पेंड हो जाता है (पश्च-दबाव)। डिफ़ॉल्ट क्षमता 64 है।
import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*
import kotlinx.coroutines.channels.Channel
fun main() = runBlocking {
flow { repeat(5) { emit(it) } }
.buffer(Channel.RENDEZVOUS) // 0: producer waits
// .buffer(Channel.BUFFERED) // default: 64
// .buffer(Channel.UNLIMITED) // unbounded
.collect { delay(50); println(it) }
}केवल नवीनतम मान के लिए conflate()
जब संग्रहकर्ता धीमा होता है, तो conflate() बीच के मानों को छोड़कर केवल सबसे हाल के उत्सर्जन को रखता है। यह यूआई स्थिति के लिए उपयोगी है।
import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*
fun main() = runBlocking {
flow {
repeat(5) { i -> emit(i); delay(50) }
}.conflate()
.collect { i ->
delay(150)
println("Collected: $i") // skips some values
}
}धीमे संग्रहकर्ताओं के लिए collectLatest
जब नया मान आता है, तो collectLatest वर्तमान संग्रहण ब्लॉक को रद्द कर देता है और नवीनतम मान के साथ उसे फिर से शुरू करता है।
import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*
fun main() = runBlocking {
flow {
emit(1); delay(50)
emit(2); delay(50)
emit(3)
}.collectLatest { value ->
println("Processing $value")
delay(100) // gets cancelled if new value arrives
println("Done $value") // only prints for last value
}
}flowOn + buffer प्रतिरूप
flowOn और buffer को मिलाएँ: उत्पादक को IO (नेटवर्क/डिस्क) पर चलाएँ, परिणामों को बफ़र करें और मुख्य डिस्पैचर पर संग्रह करें।
import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*
fun fetchItems(): Flow<String> = flow {
repeat(3) { i ->
delay(100) // simulate IO
emit("item-$i")
}
}.flowOn(Dispatchers.IO).buffer(10)
fun main() = runBlocking {
fetchItems().collect { println("UI: $it") }
}समवर्ती उत्पादकों के लिए channelFlow
channelFlow चैनल पर आधारित फ़्लो बनाता है, जिससे बिल्डर के भीतर कई कोरूटीन समवर्ती रूप से उत्सर्जन कर सकती हैं।
import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*
fun concurrentFlow(): Flow<Int> = channelFlow {
launch { send(1) }
launch { send(2) }
launch { send(3) }
}
fun main() = runBlocking {
concurrentFlow().collect { println(it) }
}सही रणनीति चुनना
सारांश: संदर्भ बदलने के लिए flowOn, प्रवाह-क्षमता के लिए buffer, केवल नवीनतम यूआई मान के लिए conflate, और पुराने प्रसंस्करण को रद्द करने के लिए collectLatest।
import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*
// Guidelines:
// CPU-heavy production -> flowOn(Dispatchers.Default)
// IO-heavy production -> flowOn(Dispatchers.IO)
// Slow consumer -> buffer()
// UI state updates -> conflate() or StateFlow
// Search/autocomplete -> collectLatest or flatMapLatest
fun main() = runBlocking { println("Choose the right strategy!") }त्वरित जाँच
फ़्लो श्रृंखला में flowOn किसे प्रभावित करता है?
पुनरावलोकन
flowOn ऊपरी कार्य को दूसरे डिस्पैचर पर ले जाता है। buffer प्रवाह-क्षमता के लिए उत्पादक और उपभोक्ता को अलग करता है। conflate बीच के मानों को छोड़ देता है। collectLatest नए मान आने पर धीमे प्रसंस्करण को रद्द कर देता है।
एआई शिक्षक के साथ Kotlin सीखें — निःशुल्क
अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।
- पाठ्यक्रम
- 51
- पाठ
- 203
अक्सर पूछे जाने वाले प्रश्न
क्या “flowOn और buffer: Context और Backpressure” पाठ निःशुल्क है?
हाँ — Kotlin Academy अध्ययन पथ के 3 तक कोई भी पाठ, जिसमें “flowOn और buffer: Context और Backpressure” भी शामिल है, यहाँ वेब पर पूरा पढ़ना निःशुल्क है। इसके बाद CoddyKit PRO हर पाठ अनलॉक करता है, साथ ही अंतर्निर्मित कोड संपादक और चौबीसों घंटे एआई शिक्षक के साथ इंटरैक्टिव अभ्यास भी उपलब्ध कराता है। Kotlin Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
“flowOn और buffer: Context और Backpressure” में मैं क्या सीखूँगा?
flowOn से emission context बदलें और backpressure के लिए emissions को buffer करें। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ Kotlin Academy का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।
क्या Kotlin Academy शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?
पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर Kotlin Academy शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 4वाँ पाठ है।
“flowOn और buffer: Context और Backpressure” पाठ पूरा करने में कितना समय लगता है?
CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।
क्या मैं इस Kotlin Academy पाठ में कोड लिख और चला सकता हूँ?
हाँ। हर Kotlin Academy पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।
इस पाठ्यक्रम के सभी पाठ
- Flow Operators: map, filter, transform और take
- catch और onCompletion: Flow में Error Handling
- combine और zip: अनेक Flows को मिलाना
- flowOn और buffer: Context और Backpressure