Producer-consumer
- Kotlin kursu
- İleri seviye
- Ders 69/83
- 5 dk
Channel ile producer-consumer deseni öğrenirsin.
Producer-consumer ve Channel
Channel, coroutine'ler arası veri aktarır. Producer send ile yazar, consumer receive veya for ile okur. Bu, producer-consumer deseninin temelidir.
Örnek: val ch = Channel<Int>(3); ch.send(1); ch.close(). Consumer tarafta for (v in ch) println(v). Channel(3) 3 elemanlık buffer sağlar; close akışı sonlandırır. Bu kalıp, paralel üretim ve tüketim için kullanılır.
Buffered ve rendezvous channel
Channel() varsayılan olarak rendezvous'dur; send karşılıklı buluşmaya kadar bekler. Channel(n) n elemanlık buffer verir; send buffer dolana kadar bekler.
Örnek: Channel<Int>() rendezvous, Channel<Int>(3) 3 bufferlı. Buffered channel, producer'ın consumer'dan bağımsız çalışmasına izin verir. close() ile channel kapatılır; consumer döngüsü sonlanır.
Uygulama Channel ile üç değer üret
main fonksiyonunu runBlocking ile aç. val ch = Channel<Int>(3) oluştur; 1, 2, 3 gönder, close() çağır. for (v in ch) println(v) ile değerleri yazdır.
Başlangıç kodu
import kotlinx.coroutines.channels.Channel
import kotlinx.coroutines.runBlocking
// main'i runBlocking ile aç
// üç bufferlı kanal oluştur, üç değer gönder, kapat, for ile yazdırÖrnek çözüm
import kotlinx.coroutines.channels.Channel
import kotlinx.coroutines.runBlocking
fun main() = runBlocking {
val ch = Channel<Int>(3)
ch.send(1)
ch.send(2)
ch.send(3)
ch.close()
for (v in ch) println(v)
}Beklenen çıktı
1 2 3
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 Channel parçalarını eşle
| Kavram | Anlamı |
|---|---|
Channel<Int>(3) |
Buffered channel |
send(1) |
Üretim |
close() |
Akış sonu |
for (v in ch) |
Tüketim |
2 Channel'i kapatmak ve akışı sonlandırmak için hangi metot kullanılır?
- stop()
- terminate()
- end()
- close() Doğru cevap
Açıklama: close() channel'ı kapatır ve tüketimi bitirir.
3 Channel tanımını tamamla
val ch = ____<Int>(3)
val ch = Channel<Int>(3)
Açıklama: Channel<Int>(3) 3 bufferlı channel tanımlar.