Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

+1 467новых вакансий за сутки·93 721вакансия открыта сейчас·Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Новые вакансии в TelegramРаботодателям
Talanto
Вакансии
Компании7 267
РезюмеAIПодготовкаСтатьи
BoostТарифыBoost
Войти

Не нашли подходящее?

Пусть нужная вакансия найдёт вас сама.

  1. Подборка в TelegramНовые вакансии по вашему фильтру — сразу в бота.Подключить
  2. Мэтчи по резюмеЗагрузите резюме — покажем, где вы подходите лучше всего.Загрузить
  3. Сохранить фильтрНастройте поиск один раз и возвращайтесь к новым вакансиям.Настроить
Что нового на TalantoTalanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Для работодателей

Опубликуйте вакансию — отклики придут в ваш кабинет.

  1. Вакансиябесплатно
  2. Откликиконтакты бесплатно
  3. Наймэтапы и интервью

40 компаний публикуют вакансии напрямую · 4 401 кандидат открыт к предложениям

Разместить вакансию

Популярные направления

Все подборки
  • Python17 129
  • Облачные технологии14 088
  • QA вакансии3 457
  • Backend вакансии2 115
  • Инженер данных1 805
  • Продакт-менеджер1 262

Разработка

  • Android1 865
  • iOS1 698
  • Fullstack вакансии989
  • AI вакансии949
  • Frontend вакансии744
  • Mobile вакансии44

По стеку

  • Go8 660
  • Java6 550
  • Node.js2 020
  • .NET1 722
  • Kotlin1 619
  • Rust1 455
  • C#711
  • PHP683
  • C++572

DevOps и инфраструктура

  • Kubernetes7 769
  • DevOps вакансии6 056
  • Linux-инфраструктура5 493
  • Terraform / IaC4 266
  • CI/CD3 250
  • Мониторинг и Observability1 788
  • SRE567
  • Кибербезопасность453

Аналитика и данные

  • Data Scientist1 141
  • Бизнес-аналитик927
  • Аналитик данных854
  • Системный аналитик153

Другие направления

  • Проджект-менеджер616
  • UI/UX дизайн146
  • Ручное тестирование14

По регионам

  • Вакансии в США44 281
  • Вакансии в Европе23 875
  • Вакансии в Канаде4 475
  • Работа в России3 922

По формату

  • Удалённые вакансии75 035
  • Релокация в США44 281
  • Гибридная работа12 401
  • Офисная работа7 079

По уровню

  • Senior вакансии42 679
  • Middle вакансии20 894
  • Junior вакансии6 722

Сейчас нанимают

Все компании
  • Wise190 вакансий
  • Rakuten189 вакансий
  • ASML166 вакансий
  • Grab137 вакансий
  • Celonis39 вакансий
  • Spotify37 вакансий
  • Adyen28 вакансий
  • Infobip28 вакансий
  • Monzo20 вакансий
  • Darktrace16 вакансий

Вакансии из 344 источников: карьерные страницы компаний и джоб-борды.

КомпанииО насНовостиПубличная офертаУсловия использованияПолитика конфиденциальностиПоддержка
←К теме Kotlin CoroutinesВсе вопросы
Kotlin CoroutinesMiddleТеория

В чём разница между холодными (cold) и горячими (hot) flows?

В закладки
Сначала попробуйте ответить сами30 секунд
Сравнить с ответом ↓

Cold Flow запускает producer-блок заново при каждом collect (flow builder, callbackFlow). Hot Flow (StateFlow, SharedFlow) существует независимо от подписчиков и разделяется между несколькими collectors. Превратить cold в hot можно через shareIn() или stateIn().

Cold Flow — ленивый, независимый для каждого collector

Холодный (cold) Flow не производит данные, пока нет активного collect. Каждый вызов collect запускает producer-блок заново, независимо от других subscribers. Стандартный flow { emit(...) } builder всегда создаёт холодный Flow.

fun fetchUser(id: String): Flow<User> = flow {
    println("Fetching user $id...") // выполняется при каждом collect
    val user = api.getUser(id)       // HTTP-запрос
    emit(user)
}

fun main() = runBlocking {
    val userFlow = fetchUser("42")

    userFlow.collect { println("Collector 1: $it") } // HTTP-запрос #1
    userFlow.collect { println("Collector 2: $it") } // HTTP-запрос #2 — producer запущен снова!
}

Hot Flow — активен независимо от subscribers

Горячий (hot) Flow производит данные независимо от наличия collectors. Новый subscriber получает только те значения, которые эмитятся после его подписки (или с replay, если настроен). Примеры: StateFlow, SharedFlow, Channel.receiveAsFlow().

class SensorViewModel : ViewModel() {
    // SharedFlow — hot, broadcast нескольким collectors
    private val _sensorData = MutableSharedFlow<SensorReading>(
        replay = 1,              // новый subscriber получит последнее значение
        extraBufferCapacity = 16
    )
    val sensorData: SharedFlow<SensorReading> = _sensorData.asSharedFlow()

    // StateFlow — hot, всегда хранит текущее значение
    private val _uiState = MutableStateFlow<UiState>(UiState.Loading)
    val uiState: StateFlow<UiState> = _uiState.asStateFlow()

    fun onNewReading(reading: SensorReading) {
        viewModelScope.launch {
            _sensorData.emit(reading) // все активные collectors получат это
        }
        _uiState.value = UiState.Ready(reading) // немедленно обновляет состояние
    }
}

// Два экрана подписываются на один поток данных
viewModel.sensorData.collect { screen1.update(it) }
viewModel.sensorData.collect { screen2.update(it) } // те же данные, не дублируется запрос

Преобразование cold в hot: shareIn и stateIn

Если нужно разделить дорогой cold Flow между несколькими collectors, используйте shareIn или stateIn:

class LocationRepository(
    private val locationManager: LocationManager,
    private val scope: CoroutineScope
) {
    // Cold Flow из callbackFlow
    private val rawLocation: Flow<Location> = locationManager.locationFlow()

    // Hot SharedFlow — один listener на ОС, несколько observers в приложении
    val sharedLocation: SharedFlow<Location> = rawLocation
        .shareIn(
            scope = scope,
            started = SharingStarted.WhileSubscribed(stopTimeoutMillis = 5_000),
            replay = 1
        )

    // StateFlow — для текущей позиции
    val currentLocation: StateFlow<Location?> = rawLocation
        .stateIn(
            scope = scope,
            started = SharingStarted.WhileSubscribed(5_000),
            initialValue = null
        )
}

Сравнительная таблица

  • flow { } — cold, один collector, producer перезапускается при каждом collect
  • channelFlow { } — cold, но разрешает send из разных корутин внутри блока
  • SharedFlow — hot, broadcast, нет initial value, настраиваемый replay
  • StateFlow — hot, broadcast, всегда имеет текущее значение, дедуплицирует consecutive equals
  • Channel.receiveAsFlow() — hot, но один consumer (точечная доставка)

Подводные камни

  • Множественный collect cold Flow — каждый collector запускает producer отдельно; HTTP-запрос, DB-запрос или тяжёлое вычисление выполняется N раз; решение: shareIn
  • StateFlow дедупликация — если два последовательных значения равны по equals, второй emit игнорируется; для one-shot событий (навигация, ошибки) используйте SharedFlow
  • SharedFlow с replay при подписке — новый collector немедленно получит последние replay значений; неожиданно если flow используется для событий навигации
  • SharingStarted.Eagerly vs WhileSubscribed — Eagerly стартует сразу и никогда не останавливается, тратя ресурсы; WhileSubscribed(5_000) останавливается через 5 с после последнего unsubscribe (Android: переживает смену конфигурации)
  • Утечка hot Flow в тестах — SharedFlow/StateFlow созданные с GlobalScope или отдельным scope не завершаются с тестом; передавайте TestScope
  • collect блокирует до отмены scope — hotFlow.collect { } не завершается само; нужно вызывать в отдельном launch или использовать операторы типа take(n), first()
  • flowOn не влияет на hot Flow — flowOn(Dispatchers.IO) меняет dispatcher только для cold upstream-части; StateFlow/SharedFlow работают на своём dispatcher

Частые вопросы на собеседовании

  • Что такое structured concurrency и почему это важно?
  • В чём разница между билдерами coroutine launch и async?
  • Что такое suspend-функция и где её можно вызывать?
  • Что такое Flow в Kotlin и чем он отличается от suspend fun, возвращающей одно значение?

Типичные ошибки

  • Объяснять «cold и hot flows» только как синтаксис и не описывать поведение runtime/compiler.
  • Игнорировать важный риск: Путаница влияет на networking, caching и события: можно случайно сделать несколько запросов или потерять emission.
  • Давать пример без edge case: отмены, null, recomposition, platform boundary или ошибки.

Что проверяет интервьюер

  • Формулирует суть темы «cold и hot flows» своими словами и связывает ее с кодом.
  • Называет механизм: StateFlow и SharedFlow являются hot; flow builder обычно cold и повторно выполняет блок при collect.
  • Видит production-последствие: Путаница влияет на networking, caching и события: можно случайно сделать несколько запросов или потерять emission.

Как вы знаете этот вопрос?

Проверить себя по теме Kotlin Coroutines →

Источники

  • https://kotlinlang.org/docs/flow.html
  • https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/-shared-flow/
←Предыдущий вопросКак реализовать кооперативную отмену и что такое `ensureActive()`?Следующий вопрос→Расскажите о случае, когда вы решали проблему с Kotlin Coroutines: lifecycle, performance, testing, release или platform integration.

Связанные темы

Kotlin Coroutinescold-hot-flows-reasoningconcurrencykotlin coroutines