[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
코틀린 동시성 프로그래밍(에이콘)
댓글남기기