Kotlin Academy · Ders

Channel Temelleri: send, receive ve close

Kanallar oluşturun, değer gönderip alın ve kanalları düzgün biçimde kapatın.

1. ders / 413 adım

Channel Temelleri: send, receive ve close, CoddyKit'te ücretsiz bir Kotlin Academy dersidir. Bu, 4 dersinin 1. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Kotlin Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Kotlin Academy kursu toplamda 4 dersten oluşur.

Kanal Nedir?

Channel, korutinler arasında iletişim kurmak için kullanılan bir korutin temel öğesidir; engelleyen bir kuyruk gibidir ancak bekletmek yerine askıya alır. Bunu bir boru gibi düşünebilirsiniz: bir taraf gönderir, diğer taraf alır.

import kotlinx.coroutines.*
import kotlinx.coroutines.channels.*
fun main() = runBlocking {
    val channel = Channel<Int>()
    launch {
        for (i in 1..5) channel.send(i)
        channel.close()
    }
    for (x in channel) println(x) // 1 2 3 4 5
}

send ve receive

send(value), alıcı hazır olana kadar askıya alınır. receive(), kullanılabilir bir değer olana kadar askıya alınır.

import kotlinx.coroutines.*
import kotlinx.coroutines.channels.*
fun main() = runBlocking {
    val ch = Channel<String>()
    launch {
        ch.send("ping")
        println("sent")
    }
    val msg = ch.receive()
    println("received: $msg")
}

Kanalı Kapatma

channel.close(), artık başka değer gönderilmeyeceğini bildirir. Alıcılar arabellekte kalan değerleri alır, ardından for döngüsü sona erer.

import kotlinx.coroutines.*
import kotlinx.coroutines.channels.*
fun main() = runBlocking {
    val ch = Channel<Int>(3)
    launch {
        repeat(3) { ch.send(it) }
        ch.close()  // signal done
    }
    for (v in ch) println(v) // 0 1 2, then loop ends
    println("Channel consumed")
}

isClosedForSend / isClosedForReceive

Kanalın durumunu isClosedForSend (başka gönderime izin verilmez) ve isClosedForReceive (tüm değerler tüketildi) ile denetleyin.

import kotlinx.coroutines.*
import kotlinx.coroutines.channels.*
fun main() = runBlocking {
    val ch = Channel<Int>()
    launch {
        ch.send(1)
        ch.close()
    }
    println(ch.receive())
    println("isClosedForReceive: ${ch.isClosedForReceive}")
}

üretici Oluşturucusu

produce { }, bir üretici korutini oluşturan ve bir ReceiveChannel döndüren korutin oluşturucusudur. Blok sona erdiğinde kanal otomatik olarak kapanır.

import kotlinx.coroutines.*
import kotlinx.coroutines.channels.*
fun CoroutineScope.squares(n: Int) = produce<Int> {
    for (i in 1..n) send(i * i)
}
fun main() = runBlocking {
    val sq = squares(5)
    for (v in sq) println(v) // 1 4 9 16 25
}

consumeEach Uzantısı

consumeEach { }, bir kanal üzerinde yineleme yapar ve blok hata verdiğinde kanalı iptal ederek sızıntıları önler.

import kotlinx.coroutines.*
import kotlinx.coroutines.channels.*
fun main() = runBlocking {
    val ch = produce<String> {
        send("a"); send("b"); send("c")
    }
    ch.consumeEach { println(it) }
}

tryReceive ve trySend

Askıya almayan alternatifler: trySend / tryReceive, askıya almadan hemen bir ChannelResult döndürür.

import kotlinx.coroutines.*
import kotlinx.coroutines.channels.*
fun main() = runBlocking {
    val ch = Channel<Int>(1)
    val sendResult = ch.trySend(42)
    println("Sent: ${sendResult.isSuccess}")
    val recvResult = ch.tryReceive()
    println("Got: ${recvResult.getOrNull()}")
}

Çoklu Tüketicilere Dağıtım

Birden çok korutin aynı kanaldan veri alarak işi paylaşabilir; bu, çoklu tüketicilere dağıtım örüntüsüdür.

import kotlinx.coroutines.*
import kotlinx.coroutines.channels.*
fun main() = runBlocking {
    val tasks = produce { repeat(6) { send(it) } }
    repeat(3) { worker ->
        launch {
            for (task in tasks) {
                println("Worker $worker: task $task")
            }
        }
    }
}

Çoklu Üreticilerden Birleştirme

Birden çok korutin aynı kanala veri göndererek çıktıları birleştirebilir; bu, çoklu üreticilerden birleştirme örüntüsüdür.

import kotlinx.coroutines.*
import kotlinx.coroutines.channels.*
fun main() = runBlocking {
    val results = Channel<String>()
    repeat(3) { i ->
        launch { results.send("result-$i") }
    }
    launch {
        repeat(3) { println(results.receive()) }
        results.close()
    }
}

İşlem Hattı Örüntüsü

Kanalları, her aşamanın bir kanaldan okuyup başka bir kanala yazdığı bir işlem hattında birbirine bağlayın; bu, veri işleme iş akışları için çok uygundur.

import kotlinx.coroutines.*
import kotlinx.coroutines.channels.*
fun CoroutineScope.numbers() = produce { for (i in 1..5) send(i) }
fun CoroutineScope.doubled(input: ReceiveChannel<Int>) = produce { for (v in input) send(v * 2) }
fun main() = runBlocking {
    val nums = numbers()
    val doubled = doubled(nums)
    for (v in doubled) println(v) // 2 4 6 8 10
    coroutineContext.cancelChildren()
}

Kanal ve Akış Karşılaştırması

Kanallar sıcaktır ve durum bilgisi taşır; tüketimden bağımsız olarak var olurlar. Akışlar soğuk ve bildirimseldir; her toplama işleminde yeniden başlarlar. Veri akışları için Flow'u, üretici-tüketici iletişimi için Channel'ı tercih edin.

import kotlinx.coroutines.*
import kotlinx.coroutines.channels.*
import kotlinx.coroutines.flow.*
// Flow (cold): each collect() re-runs the block
// Channel (hot): shared; multiple receivers share the same stream
fun main() = runBlocking { println("Flow = cold; Channel = hot") }

Hızlı Kontrol

channel.close() çağırdığınızda ne olur?

Özet

send ve receive, diğer taraf hazır olana kadar askıya alınır. close(), tamamlanmayı bildirir. Kendini kapatan üreticiler için üretmeyi, güvenli yineleme için consumeEach öğesini ve çoklu tüketicilere dağıtım/çoklu üreticilerden birleştirme örüntüleri için kanalları kullanın.

Başlamak ücretsiz

Yapay zeka eğitmeniyle Kotlin öğren — ücretsiz

Tarayıcında gerçek kod yaz ve çalıştır, 7/24 yapay zeka eğitmeninden anında yardım al; web'de ya da uygulamada kaldığın yerden devam et.

Kurslar
51
Dersler
203

Sıkça Sorulan Sorular

“Channel Temelleri: send, receive ve close” dersi ücretsiz mi?

Evet — “Channel Temelleri: send, receive ve close” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Kotlin Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Kotlin Academy kursu toplamda 4 dersten oluşur.

“Channel Temelleri: send, receive ve close” dersinde ne öğreneceğim?

Kanallar oluşturun, değer gönderip alın ve kanalları düzgün biçimde kapatın. Kotlin Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

Kotlin Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te Kotlin Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 1. dersidir.

“Channel Temelleri: send, receive ve close” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu Kotlin Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her Kotlin Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. Channel Temelleri: send, receive ve close
  2. Channel Türleri: Rendezvous, Buffered, Conflated, Unlimited
  3. Paylaşılan Durum için Mutex ve Semaphore
  4. Actor'ler ve Yapılandırılmış Durum Yönetimi
← Kotlin Academy Sayfasına Dön