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

+921новая вакансия за сутки·58 907вакансий открыто сейчас·Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

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

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

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

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

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

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

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

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

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

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

Все подборки
  • Python9 813
  • Облачные технологии6 898
  • QA вакансии2 239
  • Android1 398
  • Инженер данных922
  • Продакт-менеджер346

Разработка

  • iOS1 305
  • Backend вакансии1 280
  • AI вакансии569
  • Fullstack вакансии543
  • Frontend вакансии450
  • Mobile вакансии27

По стеку

  • Go5 484
  • Java3 453
  • Node.js1 146
  • Kotlin1 133
  • Rust883
  • .NET837
  • PHP383
  • C++265
  • C#261

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

  • Kubernetes3 893
  • Linux-инфраструктура3 013
  • DevOps вакансии2 970
  • Terraform / IaC2 240
  • CI/CD1 066
  • Мониторинг и Observability1 051
  • SRE304
  • Кибербезопасность52

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

  • Аналитик данных542
  • Data Scientist482
  • Бизнес-аналитик455
  • Системный аналитик60

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

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

По регионам

  • Вакансии в США30 650
  • Вакансии в Европе12 551
  • Работа в России3 510
  • Вакансии в Канаде2 658

По формату

  • Удалённые вакансии48 186
  • Релокация в США30 650
  • Гибридная работа7 410
  • Офисная работа5 407

По уровню

  • Senior вакансии26 826
  • Middle вакансии12 754
  • Junior вакансии4 519

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

Все компании
  • Rakuten189 вакансий
  • ASML163 вакансии
  • Grab134 вакансии
  • Wise134 вакансии
  • Celonis30 вакансий
  • Infobip28 вакансий
  • Spotify24 вакансии
  • Adyen19 вакансий
  • Darktrace17 вакансий
  • Monzo13 вакансий

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

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

Что такое withContext() и когда его следует использовать?

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

withContext() переключает корутину на другой диспетчер без создания новой корутины, приостанавливается до завершения блока и возвращает результат; используется для переноса блокирующих или CPU-интенсивных операций на нужный пул потоков.

Базовый синтаксис

import kotlinx.coroutines.*

suspend fun readFile(path: String): String =
    withContext(Dispatchers.IO) {
        // Выполняется на IO-пуле, не блокирует main/default
        java.io.File(path).readText()
    }

suspend fun processData(data: String): Result =
    withContext(Dispatchers.Default) {
        // CPU-интенсивная работа на Default-пуле
        heavyComputation(data)
    }

withContext() в Kotlin Coroutines

withContext(context) — suspend-функция, которая выполняет блок кода в указанном CoroutineContext, приостанавливает текущую корутину до завершения блока и возвращает его результат. В отличие от launch и async, она не создаёт новую корутину, а изменяет контекст существующей.

Переключение диспетчеров

Типичный паттерн Android: ViewModel запускает корутину на Main, переключается на IO для данных, возвращается на Main для UI-обновления:

class UserViewModel(private val repo: UserRepository) : ViewModel() {

    fun loadUser(id: String) {
        viewModelScope.launch { // Main dispatcher
            _uiState.value = UiState.Loading

            val user = withContext(Dispatchers.IO) { // переключаемся
                repo.fetchUser(id)  // network/DB call
            } // автоматически возвращаемся на Main

            _uiState.value = UiState.Success(user) // снова на Main
        }
    }
}

withContext vs async/await

// withContext — последовательное выполнение, возвращает значение
val user = withContext(Dispatchers.IO) { repo.getUser(id) }
val orders = withContext(Dispatchers.IO) { repo.getOrders(id) }
// ^ Это последовательно! user загружается, потом orders

// async — параллельное выполнение
val userDeferred = async(Dispatchers.IO) { repo.getUser(id) }
val ordersDeferred = async(Dispatchers.IO) { repo.getOrders(id) }
val user = userDeferred.await()
val orders = ordersDeferred.await()
// ^ Параллельно! Быстрее, если задачи независимы

withContext(NonCancellable)

Специальный случай: cleanup-код, который должен выполниться даже при отмене корутины:

suspend fun saveAndClose(connection: Connection) {
    try {
        connection.save()
    } finally {
        withContext(NonCancellable) {
            connection.close() // выполнится даже если корутина отменена
        }
    }
}

Диспетчеры и их назначение

  • Dispatchers.Main — UI-поток Android, обновление View/State
  • Dispatchers.IO — сеть, файлы, база данных (блокирующий IO)
  • Dispatchers.Default — CPU-интенсивные вычисления, парсинг
  • Dispatchers.Unconfined — не переключает поток; только для специальных случаев

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

  • withContext последовательно: два withContext подряд — это два последовательных переключения, не параллельное выполнение.
  • Частые переключения контекста (withContext в цикле) создают overhead; батчируйте работу.
  • withContext(Dispatchers.IO) не защищает от бесконечного блока — всегда добавляйте withTimeout.
  • Изменение UI-состояния внутри withContext(Dispatchers.IO) вызовет crash на Android (только Main).
  • NonCancellable нельзя использовать за пределами finally — это архитектурная ошибка.
  • withContext не создаёт новую корутину, поэтому CoroutineExceptionHandler родителя перехватит его исключения.
  • Вложенные withContext(Dispatchers.IO) внутри друг друга — лишний overhead без пользы.

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

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

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

  • Объяснять «withContext()» только как синтаксис и не описывать поведение runtime/compiler.
  • Игнорировать важный риск: Нельзя использовать withContext как универсальный способ спрятать blocking работу без выбора правильного dispatcher-а.
  • Давать пример без edge case: отмены, null, recomposition, platform boundary или ошибки.

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

  • Формулирует суть темы «withContext()» своими словами и связывает ее с кодом.
  • Называет механизм: Он сохраняет structured concurrency: вызывающая coroutine suspend-ится, а дочерняя работа отменяется вместе с родителем.
  • Видит production-последствие: Нельзя использовать withContext как универсальный способ спрятать blocking работу без выбора правильного dispatcher-а.

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

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

Источники

  • https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/with-context.html
←Предыдущий вопросКак реализовать таймаут в coroutine с помощью `withTimeout`?Следующий вопрос→Какие production-риски есть у Kotlin Coroutines: memory, lifecycle bugs, accessibility, offline mode, app size или platform-specific behavior?

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

Kotlin Coroutinesconcurrencykotlin coroutineswith-context-reasoning