Новое: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 MultiplatformВсе вопросы
Kotlin MultiplatformMiddleТеория

Какова роль kotlinx.coroutines в KMP и как он настраивается для каждой платформы?

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

kotlinx.coroutines предоставляет единый async API (suspend, Flow, structured concurrency) для всех KMP-платформ. Настройка отличается по dispatcher-ам: на iOS нет автоматического Main dispatcher, на Android он привязан к Looper.

Конфигурация в KMP-проекте

// build.gradle.kts
kotlin {
    sourceSets {
        commonMain.dependencies {
            implementation(libs.kotlinx.coroutines.core)
        }
        androidMain.dependencies {
            implementation(libs.kotlinx.coroutines.android) // добавляет Dispatchers.Main для Android
        }
    }
}

// commonMain: dispatcher инжектируется, не хардкодится
class UserRepository(
    private val api: UserApi,
    private val ioDispatcher: CoroutineDispatcher = Dispatchers.Default
) {
    suspend fun fetchUser(id: String): User = withContext(ioDispatcher) {
        api.getUser(id)
    }
}

// commonMain: Flow работает на всех платформах одинаково
class AuthViewModel(private val repo: TokenRepository) {
    val authState: Flow<AuthState> = repo.observeToken()
        .map { token -> if (token != null) AuthState.LoggedIn else AuthState.LoggedOut }
        .catch { emit(AuthState.Error(it)) }
}

// iosMain: мост к Swift через callback (до появления async/await bridge)
fun observeAuthState(
    viewModel: AuthViewModel,
    scope: CoroutineScope,
    onState: (AuthState) -> Unit
) {
    scope.launch {
        viewModel.authState.collect { onState(it) }
    }
}

Роль kotlinx.coroutines в KMP

kotlinx.coroutines — единственная официальная библиотека structured concurrency, поддерживающая все KMP targets. В commonMain она предоставляет suspend-функции, Flow, CoroutineScope и стандартные dispatcher-ы. На каждой платформе реализация dispatcher-ов отличается.

Платформенные различия dispatcher-ов

  • Android: Dispatchers.Main реализован через Android Looper; доступен автоматически при наличии kotlinx-coroutines-android в зависимостях.
  • iOS (Kotlin/Native): Dispatchers.Main требует явной инициализации; используется kotlinx-coroutines-core без дополнительного артефакта, но основной поток привязан к RunLoop.
  • JVM/Desktop: Dispatchers.Main зависит от UI-фреймворка (Swing, JavaFX); без артефакта kotlinx-coroutines-swing вызов бросает исключение.

Structured concurrency на платформенной границе

На iOS корутины запускаются в scope, который привязан к lifecycle View или ViewController. При переходе на другой экран scope нужно отменять явно — автоматического механизма, как viewModelScope в Android, нет. Типовое решение — создавать scope в init и отменять в onDestroy / deinit.

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

  • Использовать Dispatchers.Main напрямую в commonMain — на iOS без корректной инициализации RunLoop бросает IllegalStateException.
  • Предполагать наличие Dispatchers.IO на всех платформах — на Kotlin/Native его нет; используйте Dispatchers.Default или собственный dispatcher.
  • Запускать корутину без scope на iOS — утечка памяти и продолжение работы после уничтожения экрана.
  • Не добавлять kotlinx-coroutines-android в androidMain — Dispatchers.Main не резолвится, приложение крашится при первом обращении к UI.
  • Использовать GlobalScope в shared-коде — нет отмены при lifecycle-событиях, сложно тестировать.
  • Передавать CoroutineScope через границу iOS без обёртки — Swift видит его как непрозрачный тип, управлять lifecycle нельзя.
  • Игнорировать CoroutineExceptionHandler на iOS — необработанные исключения в корутинах могут крашить приложение без stack trace.

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

  • Объяснять «роль kotlinx.coroutines в KMP» только как синтаксис и не описывать поведение runtime/compiler.
  • Игнорировать важный риск: Нельзя писать common API, который подразумевает Android Main dispatcher или JVM executor на всех targets.
  • Давать пример без edge case: отмены, null, recomposition, platform boundary или ошибки.

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

  • Формулирует суть темы «роль kotlinx.coroutines в KMP» своими словами и связывает ее с кодом.
  • Называет механизм: Platform-specific конфигурация касается dispatcher-ов, lifecycle scope, test dispatcher и мостов к Swift/Android UI.
  • Видит production-последствие: Нельзя писать common API, который подразумевает Android Main dispatcher или JVM executor на всех targets.

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

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

Источники

  • https://kotlinlang.org/docs/coroutines-overview.html
  • https://kotlinlang.org/docs/multiplatform/multiplatform-discover-project.html
←Предыдущий вопросКаковы build-таргеты в KMP (jvm, android, iosArm64, iosSimulatorArm64 и др.)?Следующий вопрос→Расскажите о случае, когда вы решали проблему с Kotlin Multiplatform: lifecycle, performance, testing, release или platform integration.

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

Kotlin Multiplatformcoroutines-in-kmp-reasoningplatform-boundaries

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

  • Что такое структура source set: commonMain, androidMain, iosMain?
  • Какой код можно разделять между платформами, а какой должен оставаться платформо-зависимым?
  • Как структурировать KMP-проект (shared module, платформо-зависимые модули)?
  • Что такое Kotlin Multiplatform (KMP) и какие платформы он поддерживает?