Channelの種類:Rendezvous、Buffered、Conflated、Unlimited
通信パターンに適したChannelの種類を選択します。
「Channelの種類:Rendezvous、Buffered、Conflated、Unlimited」はCoddyKit上の無料Kotlin Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはKotlin Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Kotlin Academyコースには全4レッスンが含まれています。
Channelファクトリ
Channel<T>(capacity)でチャネルを作成します。容量によってバッファリングと一時停止の動作が決まります。
import kotlinx.coroutines.channels.Channel
val rendezvous = Channel<Int>() // capacity 0
val buffered = Channel<Int>(64) // capacity 64
val unlimited = Channel<Int>(Channel.UNLIMITED)
val conflated = Channel<Int>(Channel.CONFLATED)
fun main() { println("Channel types created") }ランデブーチャネル(capacity=0)
デフォルトのチャネルです。sendは受信側の準備が整うまで一時停止し、receiveは送信側が送信するまで一時停止します。両者はランデブー、つまり同じ地点で合流します。
import kotlinx.coroutines.*
import kotlinx.coroutines.channels.*
fun main() = runBlocking {
val ch = Channel<Int>() // rendezvous
launch {
println("Sending...")
ch.send(1) // suspends until receiver is ready
println("Sent")
}
delay(100)
println("Receiving...")
println(ch.receive())
}バッファ付きチャネル
バッファ付きチャネルでは、バッファが満杯になるまで送信側は待機せずに処理を続けられます。満杯になるとsendが一時停止します。
import kotlinx.coroutines.*
import kotlinx.coroutines.channels.*
fun main() = runBlocking {
val ch = Channel<Int>(3) // buffer of 3
launch {
repeat(3) {
println("Sending $it")
ch.send(it) // does not suspend until buffer full
}
ch.close()
}
delay(500)
for (v in ch) println("Got $v")
}Channel.BUFFERED
Channel.BUFFEREDはデフォルトの容量(64)を使用します。これはChannel(64)と同等です。
import kotlinx.coroutines.channels.Channel
import kotlinx.coroutines.*
fun main() = runBlocking {
val ch = Channel<String>(Channel.BUFFERED)
println("Default buffer capacity is implementation-defined (~64)")
ch.close()
}無制限チャネル
Channel.UNLIMITEDでは送信側が一時停止することはなく、すべての値をバッファリングします。メモリが無制限に増加する可能性があるため、注意して使用してください。
import kotlinx.coroutines.*
import kotlinx.coroutines.channels.*
fun main() = runBlocking {
val ch = Channel<Int>(Channel.UNLIMITED)
launch {
repeat(1000) { ch.send(it) } // never suspends
ch.close()
}
var sum = 0
for (v in ch) sum += v
println("Sum: $sum")
}畳み込みチャネル
Channel.CONFLATEDは最も新しい値だけを保持します。前の値を受信する前に新しい値が到着すると、古い値は破棄されます。
import kotlinx.coroutines.*
import kotlinx.coroutines.channels.*
fun main() = runBlocking {
val ch = Channel<Int>(Channel.CONFLATED)
launch {
repeat(5) { ch.send(it) } // 0..4 sent rapidly
ch.close()
}
delay(50) // let all sends happen
println("Received: ${ch.tryReceive().getOrNull()}") // likely 4 (last)
}RENDEZVOUSとBUFFEREDのタイミング
ランデブーはプロデューサーとコンシューマーを同期します。バッファ付きチャネルではプロデューサーが先行して処理でき、タイミングが分離されます。
import kotlinx.coroutines.*
import kotlinx.coroutines.channels.*
fun main() = runBlocking {
val ch = Channel<Int>(Channel.BUFFERED)
val t = System.currentTimeMillis()
launch {
repeat(5) { ch.send(it) } // fast — doesn't wait
ch.close()
}
for (v in ch) { delay(100); println("$v at ${System.currentTimeMillis()-t}ms") }
}onBufferOverflow戦略
Channel(capacity, onBufferOverflow)を使うと、バッファが満杯になったときの動作を選択できます。SUSPEND(デフォルト)、DROP_OLDEST、DROP_LATESTから選択します。
import kotlinx.coroutines.*
import kotlinx.coroutines.channels.*
fun main() = runBlocking {
val ch = Channel<Int>(2, BufferOverflow.DROP_OLDEST)
launch {
repeat(5) { ch.trySend(it) } // 0,1,2,3,4 — buffer keeps newest 2
ch.close()
}
for (v in ch) println(v) // likely 3 4
}Channelの種類を選択する
選択の目安は次のとおりです。厳密な同期にはランデブー、スループットにはバッファ付き、最新値だけを扱う場合(UI状態など)には畳み込み、損失が許容されないイベントログには無制限を使用します。
import kotlinx.coroutines.channels.Channel
// Use cases:
// RENDEZVOUS — handshake between producer and consumer
// BUFFERED — decouple I/O-heavy producer from slow consumer
// CONFLATED — UI updates (only latest matters)
// UNLIMITED — audit log (never drop)
fun main() { println("Choose based on your loss tolerance and timing needs") }selectでChannelを扱う
selectを使うと、複数のチャネルを同時に待機し、最初に準備が整ったチャネルを選択できます。
import kotlinx.coroutines.*
import kotlinx.coroutines.channels.*
import kotlinx.coroutines.selects.*
fun main() = runBlocking {
val a = produce { delay(100); send("from a") }
val b = produce { delay(50); send("from b") }
val result = select<String> {
a.onReceive { it }
b.onReceive { it }
}
println(result) // "from b"
coroutineContext.cancelChildren()
}Tickerチャネル
ticker(delay)は、delayミリ秒ごとにUnitを発行するチャネルを作成します。繰り返しポーリングする場合に便利です。
import kotlinx.coroutines.*
import kotlinx.coroutines.channels.*
fun main() = runBlocking {
val ticker = ticker(delayMillis = 100, initialDelayMillis = 0)
var count = 0
for (tick in ticker) {
println("Tick ${++count}")
if (count == 3) { ticker.cancel(); break }
}
}クイックチェック
最も新しい値だけを保持するチャネルの種類はどれですか。
復習
ランデブー:同期され、バッファなし。バッファ付き:タイミングを分離。畳み込み:最新値だけを保持し、古い値を破棄。無制限:送信側を一時停止しない。値の損失をどこまで許容できるかと、必要なスループットに応じて選択します。
よくある質問
「Channelの種類:Rendezvous、Buffered、Conflated、Unlimited」レッスンは無料ですか?
はい。「Channelの種類:Rendezvous、Buffered、Conflated、Unlimited」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Kotlin Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Kotlin Academyコースには全4レッスンが含まれています。
「Channelの種類:Rendezvous、Buffered、Conflated、Unlimited」で何を学びますか?
通信パターンに適したChannelの種類を選択します。 ブラウザで直接実行するハンズオンコードでKotlin Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Kotlin Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのKotlin Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。
「Channelの種類:Rendezvous、Buffered、Conflated、Unlimited」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このKotlin Academyレッスンでコードを書いて実行できますか?
はい。すべてのKotlin Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- Channelの基本:send、receive、close
- Channelの種類:Rendezvous、Buffered、Conflated、Unlimited
- 共有状態のためのMutexとSemaphore
- Actorと構造化された状態管理