Холодные vs горячие потоки — объясни на примерах

Разделение на холодные (cold) и горячие (hot) потоки — это одна из ключевых концепций реактивного/корутин-флоуного программирования.

Холодный поток (cold)Горячий поток (hot)
Когда начинаетсяПри подписке (collect())Начинается независимо от подписчиков
Повторное получениеКаждый collector получает свои данныеВсе collectors получают одно общее событие
ПоведениеКак фабрика: «новый клиент — новая история»Как радио: «идёт независимо, слушаешь — слышишь»
Примерыflow {}, flowOf(), SequenceStateFlow, SharedFlow, LiveData, callback

Аналогии

Cold (flow) => Заказ еды в кафе: каждый получает свою порцию

Hot (stateFlow) => Табло в аэропорту: постоянно обновляется, ты просто смотришь

Пример холодного потока — Flow

fun coldFlow(): Flow<Int> = flow {
    println("Flow started")
    emit(1)
    emit(2)
}

runBlocking {
    coldFlow().collect { println("C1: $it") }
    coldFlow().collect { println("C2: $it") }
}

Вывод:

Flow started
C1: 1
C1: 2
Flow started
C2: 1
C2: 2

Обратите внимание, что поток запускается заново при каждой подписке и collect() запускает producer.

Пример горячего потока — StateFlow

val state = MutableStateFlow(0)

state.value = 1
state.value = 2
state.value = 3

state.collect { println(it) } // увидим только текущее

Вывод:

3 // увидим только текущее

Помните что, Producer уже работает, когда мы подписались. Subscriber получает только актуальное значение.


Опубликовано

в

,

от

Метки: