Buffer란?

Buffer

  • Back Pressure1을 관리한다.
  • buffer()을 통해 사용할 수 있다. Capacity2, Buffer Overflow 관리 전략3을 인자로 갖는다.

Ex

// Buffer을 사용하지 않은 경우
// 값을 방출한 후에 수집되기 전까지 다음 값을 방출하지 않는다. 
val flow = flow {
  repeat(5) {
    println("Emitter: start cooking pancake: $it")
    delay(100) // time spent to cook pancake
    println("Emitter: finish cooking pancake: $it")
    emit(it)
  }
}

flow.collect {
  println("Collector: start eating pancake: $it")
  delay(300) // time spent to eat pancake
  println("Collector: finish eating pancake: $it")
}
// 출력
// Emitter: start cooking pancake: 0
// Emitter: finish cooking pancake: 0
// Collector: start eating pancake: 0
// Collector: finish eating pancake: 0
// Emitter: start cooking pancake: 1
// Emitter: finish cooking pancake: 1
// Collector: start eating pancake: 1
// Collector: finish eating pancake: 1
// …

// Buffer을 사용한 경우 
val flow = flow {
    repeat(5) {
        println("Emitter: start cooking pancake: $it")
        delay(100) // time spent to cook pancake
        println("Emitter: finish cooking pancake: $it")
        emit(it)
    }.buffer()
}

flow.collect {
    println("Collector: start eating pancake: $it")
    delay(300) // time spent to eat pancake
    println("Collector: finish eating pancake: $it")
}
// 출력
// Emitter: start cooking pancake: 0
// Emitter: finish cooking pancake: 0
// Collector: start eating pancake: 0
// Emitter: start cooking pancake: 1
// Emitter: finish cooking pancake: 1
// Emitter: start cooking pancake: 2
// Emitter: finish cooking pancake: 2
// Emitter: start cooking pancake: 3
// Collector: finish eating pancake: 0
// …



1Back Pressure: 데이터를 생산하는 속도가 소비하는 속도보다 빠를 떄, 이로 인해 발생할 수 있는 데이터 손실.
2기본 값은 64이다. UNLIMITED를 설정할 수 있다.
3SUSPEND(기본 값), DROP_OLDEST, DROP_LATEST 중에서 선택할 수 있다.