[Coroutine] 프로듀서(Producer)

업데이트:

프로듀서

시퀀스와 이터레이터에서는 실행 중에 일시 중단할 수 없다는 제한이 있다. 이상적으로는 다른 작업이 끝나기를 기다리는 동안 일시 중단할 수 있어야 한다. 이를 위한 것이 프로듀서이다.

다음은 프로듀서의 몇가지 중요 사항이다.

  • 프로듀서는 값이 생성된 후 일시 중단되며, 새로운 값이 요청될 때 다시 재개한다. 이는 시퀀스와 이터레이터와 유사하다.
  • 프로듀서는 특정 Coroutine Scope 로 생성할 수 있다.
  • 전달되는 람다는 언제든지 일시 중단될 수 있다.
  • 채널을 사용해 작동하므로 데이터를 스트림처럼 생각할 수 있다. 요소를 수신하면 스트림에서 요소가 제거된다.

프로듀서 만들기

프로듀서를 만들려면 코루틴 빌더 produce() 를 사용하며 ReceiveChannel 를 리턴한다.

val producer = GlobalScope.produce {
    send(1)
}

launch() 또는 async() 와 같은 방식으로 CoroutineConext를 지정할 수 있다.

val context = newSingleThreadContext("myThread")

val producer = GlobalScope.produce(context) {
    send(1)
}

receive()

프로듀서로 부터 한 개씩 요소를 읽을 때 사용된다.

val context = newSingleThreadContext("myThread")

val producer = GlobalScope.produce(context) {
    for (i in 0..9) {
        send(i)
    }
}

runBlocking {
    producer.consumeEach {
        println(it)
    }
}

위 코드를 실행하면 0 이 출력된다.

consumerEach()

프로듀서의 모든 요소를 살펴보기 위해 사용된다.

val context = newSingleThreadContext("myThread")

val producer = GlobalScope.produce(context) {
    for (i in 0..9) {
        send(i)
    }
}

runBlocking {
    producer.consumeEach {
        println(it)
    }
}

위 코드를 실행하면 0부터 9까지 출력된다.

Reference

코틀린 동시성 프로그래밍(에이콘)

댓글남기기