Coroutine Channels

팬아웃*1

여러 코루틴은 작업을 분배하면서 동일한 채널에서 수신할 수 있습니다.

주기적으로 초당 10개의 숫자로 정수를 생성하는 생산자 코루틴부터 시작하겠습니다.

fun CoroutineScope.produceNumbers() = produce<Int> {
    var x = 1 // start from 1
    while (true) {
        send(x++) // produce next
        delay(100) // wait 0.1s
    }
}

그러면 여러 프로세서 코루틴*2을 가질 수 있습니다.

이 예에서 프로세서 코루틴은 ID와 받은 번호를 반환합니다.

fun CoroutineScope.launchProcessor(id: Int, channel: ReceiveChannel<Int>) = launch {
    for (msg in channel) {
        println("Processor #$id received $msg")
    }
}

이제 5개의 프로세서를 실행하고 거의 1초 동안 실행되도록 합시다.

무슨 일이 일어나는지 보자:

val producer = produceNumbers()
repeat(5) { launchProcessor(it, producer) }
delay(950)
producer.cancel() // cancel producer coroutine and thus kill them all

완전한 코드는 여기에서 찾을 수 있습니다

특정 정수를 수신하는 프로세서는 다른 ID 값을 가질 수 있지만 출력은 다음과 유사합니다.

Processor #2 received 1
Processor #4 received 2
Processor #0 received 3
Processor #1 received 4
Processor #3 received 5
Processor #2 received 6
Processor #4 received 7
Processor #0 received 8
Processor #1 received 9
Processor #3 received 10

생산자 코루틴을 중단하면 생산자 코루틴의 채널이 닫힙니다.

따라서 프로세서 코루틴에 의해 실제로 수행되고 있는 채널의 반복을 완료합니다.

또한 launchProcessor 코드가 명시적 for 루프를 사용하여 채널을 반복하여 팬 아웃하는 방법에 주목하십시오. consumerEach와 달리 이 for 루프 패턴은 여러 코루틴과 함께 사용하기에 완벽하게 안전합니다.

프로세서 코루틴이 실패하면 다른 코루틴이 채널을 처리합니다.

반면에 ConsumerEach로 작성된 프로세서는 정상적으로 또는 비정상적으로 완료될 때마다 채널을 소비(삭제)합니다.


다음 내용은 독자의 이해를 돕기 위해 번역자가 추가한 내용입니다.

*하나. 팬아웃은 얼마나 많은 논리 게이트 출력이 논리 게이트의 입력으로 사용되는지를 나타냅니다.

여기서는 채널의 출력이 여러 프로세서 코루틴의 입력으로 사용됨을 의미합니다.

*2. 프로세서 코루틴은 수신된 값을 처리하는 프로세서 코루틴을 의미합니다.


이 문서는 공식 코루틴 문서를 번역한 것입니다.

원래의: 채널 – 팬아웃

원본 텍스트의 최종 편집: 2022년 9월 28일


팬아웃*1

여러 코루틴이 동일한 채널에 값을 보낼 수 있습니다.

문자열을 처리하는 채널이 있고 주어진 문자열을 일정한 간격으로 반복적으로 채널에 보내는 일시 중단 기능이 있다고 가정합니다.

suspend fun sendString(channel: SendChannel<String>, s: String, time: Long) {
    while (true) {
        delay(time)
        channel.send(s)
    }
}

이제 문자열을 보내는 일부 코루틴을 실행할 때 어떤 일이 발생하는지 살펴보겠습니다(이 예에서는 코루틴을 메인 스레드 컨텍스트에서 메인 코루틴의 자식으로 실행합니다).

val channel = Channel<String>()
launch { sendString(channel, "foo", 200L) }
launch { sendString(channel, "BAR!
", 500L) } repeat(6) { // receive first six println(channel.receive()) } coroutineContext.cancelChildren() // cancel all children to let main finish

완전한 코드는 여기에서 찾을 수 있습니다

출력은 다음과 같습니다.

foo
foo
BAR!
foo foo BAR!


다음 내용은 독자의 이해를 돕기 위해 번역자가 추가한 내용입니다.

*하나. 팬인은 논리 게이트가 받을 수 있는 최대 입력 수입니다.

이 글에서는 Channel에 입력된 여러 개의 코루틴이 실행됨을 의미합니다.


이 문서는 공식 코루틴 문서를 번역한 것입니다.

원래의: 채널 – 팬인

원본 텍스트의 최종 편집: 2022년 9월 28일