Kotlin/포스팅

코틀린 동시성 채널

짜집퍼박사(짜박) 2024. 1. 10. 00:49

코틀린에서의 동시성 채널은 여러 코루틴 간에 안전하게 데이터를 교환하고 동기화하는 메커니즘을 제공합니다. 이는 생산자-소비자 패턴을 기반으로 하며, 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