Deffered 값은 두 코루틴 사이에 단일 값을 전달하는데 편리한 방법을 제공한다. Channel은 값의 스트림을 전달하는 방법을 제공한다.
Channel이란 무엇인가?
Channel은 개념적으로 BlockingQueue와 매우 유사하다. 주요한 다른점은 블로킹 연산인 put 대신 일시중단 연산인 send를 가지고, 블로킹 연산인 take 대신 일시중단 연산인 receive를 가진다는 점이다.*1
val channel = Channel<Int>()
launch {
// this might be heavy CPU-consuming computation or async logic, we'll just send five squares
for (x in 1..5) channel.send(x * x)
}
// here we print five received integers:
repeat(5) { println(channel.receive()) }
println("Done!")
📌 전체 코드는 이곳에서 확인할 수 있습니다.
코드의 출력은 다음과 같다
1
4
9
16
25
Done!
📖 아래 내용은 독자의 이해를 위해 번역자가 추가한 글입니다.
*1. 기존 동시성 프레임웍에서 사용하던 BlockingQueue는 모든 연산이 스레드를 블록하는 것이 기본이다. 반면 Channel은 Coroutine을 위해 설계되어 Coroutine의 Light Weight Thread 모델을 지원하여 모든 연산이 스레드를 블록하지 않는다.
이 글은 Coroutines 공식 문서를 번역한 글입니다.
원문 : Channels - Channel basics
원문 최종 수정 : 2022년 9월 28일
Channel 닫기와 반복적으로 수신하기
Channel은 Queue와 다르게 더이상 다른 원소들이 오지 않는 다는 것을 알리기 위해 닫힐 수 있다. Channel로부터 값을 받는쪽에서는 일반적인 for 루프를 사용해서 원소를 편하게 받을 수 있다.
개념적으로 close 함수는 채널로 특별한 닫기 토큰을 보내는 것과 같다. 이 닫기 토큰을 받으면 반복이 멈춘다. 따라서 닫기 토큰을 받기 전에 보내진 모든 원소들이 수신되었음을 보장할 수 있다.
val channel = Channel<Int>()
launch {
for (x in 1..5) channel.send(x * x)
channel.close() // we're done sending
}
// here we print received values using `for` loop (until the channel is closed)
for (y in channel) println(y)
println("Done!")
📌 전체 코드는 이곳에서 확인할 수 있습니다.
이 글은 Coroutines 공식 문서를 번역한 글입니다.
원문 : Channels - Closing and iteration over channels
원문 최종 수정 : 2022년 9월 28일
Producer로 Channel 만들기
Coroutine이 원소들의 시퀀스를 생성하는 패턴은 매우 일반적이다. 이는 동시성 코드에서 자주 발견되는 생산자-소비자 패턴의 일부이다. 생산자를 채널을 파라미터로 받는 함수로 추상화 할 수 있지만, 이는 함수로부터 결과가 반환되어야 한다는 상식과 맞지 않는다.
생산자측에서는 producer라는 이름을 가진 편리한 코루틴 빌더를 통해 이를 간단하게 할 수 있고, 소비자측의 for 루프를 consumeEach 확장 함수를 사용해 대체할 수 있다.
fun CoroutineScope.produceSquares(): ReceiveChannel<Int> = produce {
for (x in 1..5) send(x * x)
}
fun main() = runBlocking {
val squares = produceSquares()
squares.consumeEach { println(it) }
println("Done!")
}
📌 전체 코드는 이곳에서 확인할 수 있습니다.
이 글은 Coroutines 공식 문서를 번역한 글입니다.
원문 : Channels - Building channel producers
원문 최종 수정 : 2022년 9월 28일
목차로 돌아가기
'공식 문서 번역 > Coroutines 공식 문서' 카테고리의 다른 글
Coroutine Channels 3편 - Fan-out과 Fan-in : Channel이 얼마나 많은 출력, 입력을 만들 수 있는지 알아보기 (0) | 2023.03.07 |
---|---|
Coroutine Channels 2편 - Channel로 파이프라인 만들기, 파이프라인으로 소수 만들기 (0) | 2023.03.06 |
Coroutines Flow 8편 - Flow 실행하기, Flow와 Reactive Stream (0) | 2023.03.04 |
Coroutines Flow 7편 - Flow 수집 완료 처리하기, Flow 명령적으로 다루기 vs 선언적으로 다루기 (0) | 2023.03.03 |
Coroutines Flow 6편 - Flow 예외 처리, Flow의 예외 투명성 (0) | 2023.03.02 |