지연된 값은 두 코루틴 간에 단일 값을 전달하는 편리한 방법을 제공합니다. 채널은 가치의 흐름을 전달하는 방법을 제공합니다.
채널이란 무엇입니까?
채널은 개념적으로 BlockingQueue와 매우 유사합니다. 주요 차이점은 차단 작업 put 대신 중지 작업 전송이 있고 차단 작업 take 대신 중지 작업 수신이 있다는 것입니다.*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!
다음 내용은 독자의 이해를 돕기 위해 번역자가 추가한 내용입니다.
*하나. 기존 동시성 프레임워크에서 사용하던 BlockingQueue는 기본적으로 모든 작업에 대한 스레드를 차단합니다. 반면 Channel은 코루틴용으로 설계되었으며 코루틴의 경량 스레딩 모델을 지원하므로 모든 작업이 스레드를 차단하지 않습니다.
이 문서는 공식 코루틴 문서를 번역한 것입니다.
원래의: 채널 – 채널 기본 사항
원본 텍스트의 최종 편집: 2022년 9월 28일
채널 닫고 반복 수신
대기열과 달리 더 이상 항목이 오지 않음을 나타내기 위해 채널을 닫을 수 있습니다. 채널에서 값을 받는 쪽에서는 일반 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!")
완전한 코드는 여기에서 찾을 수 있습니다
이 문서는 공식 코루틴 문서를 번역한 것입니다.
원래의: 채널 – 채널 닫기 및 반복
원본 텍스트의 최종 편집: 2022년 9월 28일
Producer로 채널 만들기
코루틴이 요소 시퀀스를 생성하는 패턴은 매우 일반적입니다. 이는 동시 코드에서 자주 발견되는 생산자-소비자 패턴의 일부입니다. 채널을 매개변수로 사용하는 함수로 생산자를 추상화할 수 있지만 이는 결과가 함수에서 반환되어야 한다는 상식을 따르지 않습니다.
생산자 측에서는 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!")
}
완전한 코드는 여기에서 찾을 수 있습니다
이 문서는 공식 코루틴 문서를 번역한 것입니다.
원래의: 채널 – 채널 제작자 구축
원본 텍스트의 최종 편집: 2022년 9월 28일
