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

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

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

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

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

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

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

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

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

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

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

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

Все подборки
  • Python16 411
  • Облачные технологии13 173
  • QA вакансии3 433
  • Backend вакансии2 032
  • Инженер данных1 659
  • Продакт-менеджер1 151

Разработка

  • Android1 816
  • iOS1 666
  • AI вакансии938
  • Fullstack вакансии890
  • Frontend вакансии715
  • Mobile вакансии38

По стеку

  • Go8 558
  • Java6 087
  • Node.js1 888
  • Kotlin1 554
  • .NET1 545
  • Rust1 432
  • PHP640
  • C#562
  • C++498

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

  • Kubernetes7 302
  • DevOps вакансии5 581
  • Linux-инфраструктура5 291
  • Terraform / IaC4 013
  • CI/CD2 555
  • Мониторинг и Observability1 734
  • SRE546
  • Кибербезопасность392

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

  • Data Scientist1 030
  • Бизнес-аналитик867
  • Аналитик данных829
  • Системный аналитик134

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

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

По регионам

  • Вакансии в США44 612
  • Вакансии в Европе21 275
  • Вакансии в Канаде4 434
  • Работа в России3 877

По формату

  • Удалённые вакансии73 589
  • Релокация в США44 639
  • Гибридная работа11 412
  • Офисная работа6 956

По уровню

  • Senior вакансии41 074
  • Middle вакансии20 296
  • Junior вакансии6 611

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

Все компании
  • Wise194 вакансии
  • Rakuten189 вакансий
  • ASML164 вакансии
  • Grab136 вакансий
  • Celonis45 вакансий
  • Spotify36 вакансий
  • Adyen29 вакансий
  • Infobip28 вакансий
  • Monzo19 вакансий
  • Darktrace17 вакансий

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

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

Что такое CoroutineScope и почему он важен?

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

CoroutineScope хранит CoroutineContext и управляет жизненным циклом корутин: при его отмене все дочерние корутины автоматически отменяются. Это основа структурированного параллелизма, защищающая от утечек.

Создание собственного scope

import kotlinx.coroutines.*

class DataRepository {
    // Собственный scope с SupervisorJob — падение одной задачи не отменяет остальные
    private val scope = CoroutineScope(SupervisorJob() + Dispatchers.IO)

    fun loadData(id: Int) {
        scope.launch {
            val result = fetchFromNetwork(id)  // suspend-функция
            println("Loaded: $result")
        }
    }

    // Вызывается при уничтожении объекта
    fun cleanup() {
        scope.cancel()  // отменяет все активные корутины
    }

    private suspend fun fetchFromNetwork(id: Int): String {
        delay(100)  // имитация сетевого запроса
        return "Data#$id"
    }
}

fun main() = runBlocking {
    val repo = DataRepository()
    repo.loadData(1)
    repo.loadData(2)
    delay(200)
    repo.cleanup()
    println("Repository cleaned up")
}

CoroutineScope

CoroutineScope — это контейнер, который хранит CoroutineContext и определяет жизненный цикл корутин. Любая корутина, запущенная через launch или async, привязана к scope: если scope отменяется, все его дочерние корутины тоже отменяются. Это главный механизм предотвращения утечек корутин.

Зачем нужен scope

  • Управление жизненным циклом: отмена scope отменяет все запущенные в нём корутины.
  • Структурированный параллелизм: scope завершается только тогда, когда завершены все его дочерние корутины.
  • Контекст по умолчанию: хранит диспетчер, Job, имя и обработчик исключений для всех дочерних корутин.

coroutineScope vs CoroutineScope

coroutineScope { } (с маленькой буквы) — это suspend-функция-строитель, которая создаёт дочерний scope и ждёт завершения всех запущенных в нём корутин. Она не требует ручной отмены и автоматически распространяет исключения наверх.

suspend fun loadAll(): Pair<String, String> = coroutineScope {
    // оба запроса идут параллельно
    val a = async { fetchA() }
    val b = async { fetchB() }
    a.await() to b.await()
    // функция вернётся только когда оба async завершатся
}

suspend fun fetchA(): String { delay(100); return "A" }
suspend fun fetchB(): String { delay(150); return "B" }

GlobalScope — почему его избегают

GlobalScope существует на протяжении всего времени жизни приложения. Корутины, запущенные в нём, не привязаны ни к какому компоненту и не будут отменены при уничтожении экрана или объекта. Это ведёт к утечкам памяти и нежелательным фоновым операциям.

// Плохо — утечка: корутина живёт вечно
GlobalScope.launch {
    updateUi()  // ViewModel уже уничтожена, а корутина работает
}

// Хорошо — привязано к ViewModel
viewModelScope.launch {
    updateUi()
}

Встроенные scope в платформах

  • viewModelScope (Android) — отменяется при вызове onCleared().
  • lifecycleScope (Android) — отменяется при уничтожении Lifecycle-владельца.
  • MainScope() — scope с Dispatchers.Main и SupervisorJob(), для использования в UI-компонентах.

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

  • Создание CoroutineScope(Job()) вместо CoroutineScope(SupervisorJob()): падение одной дочерней корутины отменяет весь scope и все остальные задачи.
  • Забыть вызвать scope.cancel() в onDestroy / onCleared — корутины продолжат работать после уничтожения компонента.
  • Использование GlobalScope в production-коде ради «удобства» — компилятор не предупреждает, но это источник утечек.
  • Передача scope как параметра функциям — нарушает инкапсуляцию и делает управление жизненным циклом непредсказуемым. Лучше передавать suspend-функции.
  • Путаница между CoroutineScope() (функция-фабрика, возвращает объект) и coroutineScope { } (suspend-строитель блока) — разные API с разной семантикой.
  • Запуск корутины вне scope (через runBlocking) в production-коде блокирует поток и не участвует в структурированном параллелизме.

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

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

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

  • Объяснять «CoroutineScope» только как синтаксис и не описывать поведение runtime/compiler.
  • Игнорировать важный риск: Scope без жизненного цикла превращает фоновые задачи в утечки и теряет исключения.
  • Давать пример без edge case: отмены, null, recomposition, platform boundary или ошибки.

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

  • Формулирует суть темы «CoroutineScope» своими словами и связывает ее с кодом.
  • Называет механизм: Builders запускаются как extension functions на scope, поэтому дочерние задачи наследуют контекст и участвуют в structured concurrency.
  • Видит production-последствие: Scope без жизненного цикла превращает фоновые задачи в утечки и теряет исключения.

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

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

Источники

  • https://kotlinlang.org/docs/coroutines-basics.html
←Предыдущий вопросЧто такое `CoroutineDispatchers` и в чём разница между `Main`, `IO`, `Default` и `Unconfined`?Следующий вопрос→Что такое Kotlin coroutines и какую проблему они решают по сравнению с потоками?

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

Kotlin Coroutinesconcurrencycoroutine-scope-reasoningkotlin coroutines