코틀린에서의 동시성 채널은 여러 코루틴 간에 안전하게 데이터를 교환하고 동기화하는 메커니즘을 제공합니다. 이는 생산자-소비자 패턴을 기반으로 하며, Channel 클래스를 통해 구현됩니다.
1. Channel 생성 및 사용
채널은 Channel() 함수를 사용하여 생성할 수 있습니다.
import kotlinx.coroutines.*
import kotlinx.coroutines.channels.Channel
fun main() = runBlocking {
val channel = Channel<Int>()
launch {
for (x in 1..5) {
channel.send(x * x)
}
channel.close()
}
repeat(5) {
println(channel.receive())
}
}
위의 예제에서 Channel을 생성하고, 한 코루틴에서 숫자의 제곱을 채널로 전송하고, 다른 코루틴에서 채널로부터 데이터를 받아 출력합니다.
2. 채널의 종류
코틀린에서는 여러 종류의 채널을 제공합니다.
Unlimited Channel (Channel()): 용량이 제한되지 않는 채널로, 무한정 많은 아이템을 전송할 수 있습니다.
val unlimitedChannel = Channel<Int>()
Buffered Channel (Channel(capacity)): 정해진 용량을 가지며, 해당 용량 이상으로 데이터를 채널에 보내면 송신자는 일시 중단됩니다.
val bufferedChannel = Channel<Int>(capacity = 10)
Rendezvous Channel (Channel(Channel.RENDEZVOUS)): 송신자와 수신자가 만날 때만 값을 전송할 수 있으며, 용량이 0인 채널입니다.
val rendezvousChannel = Channel<Int>(Channel.RENDEZVOUS)
3. 채널의 닫기
close() 함수를 사용하여 채널을 닫을 수 있습니다. 닫힌 채널로 데이터를 전송하려고 하면 ClosedSendChannelException이 발생합니다.
val channel = Channel<Int>()
launch {
channel.send(42)
channel.close()
}
for (value in channel) {
println(value)
}
4. 채널 사용시 루프
채널을 사용할 때 for 루프를 사용하면 편리하게 데이터를 수신할 수 있습니다. 또한, 채널이 닫히면 루프가 종료됩니다.
val channel = Channel<Int>()
launch {
for (x in 1..5) {
channel.send(x * x)
}
channel.close()
}
for (value in channel) {
println(value)
}
5. 채널 사용시 수신 대기 및 타임아웃
receive() 함수를 사용하여 값을 수신하며, 수신 대기 중에는 현재 스레드를 블록합니다. receive() 함수에 타임아웃을 설정할 수도 있습니다.
val channel = Channel<Int>()
launch {
delay(1000)
channel.send(42)
}
val result = withTimeoutOrNull(500) {
channel.receive()
}
println(result)
6. select 표현식
select 표현식을 사용하면 여러 채널 중에서 먼저 값을 전달하는 채널을 선택할 수 있습니다.
import kotlinx.coroutines.selects.select
val channel1 = Channel<String>()
val channel2 = Channel<Int>()
launch {
delay(1000)
channel1.send("Hello")
}
launch {
delay(2000)
channel2.send(42)
}
select<Unit> {
channel1.onReceive { value ->
println("Received from channel1: $value")
}
channel2.onReceive { value ->
println("Received from channel2: $value")
}
}
위의 예제에서 select 표현식은 두 개의 채널 중에서 먼저 값을 전달하는 채널을 선택하고 해당 값을 출력합니다.
코틀린의 채널은 안전하게 데이터를 교환하고 동기화하는 강력한 도구입니다. 이를 활용하여 다양한 동시성 상황에서 효과적으로 통신할 수 있습니다.
With ChatGPT
'Kotlin > 포스팅' 카테고리의 다른 글
코틀린 티커 (0) | 2024.01.10 |
---|---|
코틀린 동시성 생산자 (0) | 2024.01.10 |
코틀린 동시성 통신 (0) | 2024.01.09 |
코루틴 예외 처리 (0) | 2024.01.09 |
코루틴 디스패치 (0) | 2024.01.09 |