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

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

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

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

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

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

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

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

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

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

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

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

Все подборки
  • Python17 222
  • Облачные технологии14 171
  • QA вакансии3 456
  • Backend вакансии2 114
  • Инженер данных1 801
  • Продакт-менеджер1 247

Разработка

  • Android1 858
  • iOS1 698
  • Fullstack вакансии997
  • AI вакансии955
  • Frontend вакансии755
  • Mobile вакансии44

По стеку

  • Go8 752
  • Java6 593
  • Node.js2 036
  • .NET1 739
  • Kotlin1 618
  • Rust1 472
  • C#717
  • PHP690
  • C++579

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

  • Kubernetes7 787
  • DevOps вакансии6 095
  • Linux-инфраструктура5 508
  • Terraform / IaC4 287
  • CI/CD3 272
  • Мониторинг и Observability1 792
  • SRE566
  • Кибербезопасность454

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

  • Data Scientist1 138
  • Бизнес-аналитик921
  • Аналитик данных858
  • Системный аналитик154

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

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

По регионам

  • Вакансии в США44 166
  • Вакансии в Европе24 014
  • Вакансии в Канаде4 535
  • Работа в России3 867

По формату

  • Удалённые вакансии75 005
  • Релокация в США44 166
  • Гибридная работа12 485
  • Офисная работа7 090

По уровню

  • Senior вакансии42 643
  • Middle вакансии20 960
  • Junior вакансии6 708

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

Все компании
  • Wise190 вакансий
  • Rakuten189 вакансий
  • ASML166 вакансий
  • Grab137 вакансий
  • Celonis38 вакансий
  • Spotify37 вакансий
  • Adyen29 вакансий
  • Infobip28 вакансий
  • Monzo20 вакансий
  • Darktrace17 вакансий

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

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

Что такое GlobalScope и почему его следует избегать?

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

GlobalScope — синглтон-scope, живущий всё время работы приложения. Его следует избегать, поскольку он нарушает structured concurrency: корутины не отменяются при уничтожении компонента, провоцируют утечки и делают тесты недетерминированными. Используйте viewModelScope, lifecycleScope или собственный CoroutineScope.

Пример проблемы

class MyViewModel : ViewModel() {
    fun loadData() {
        // ПЛОХО: корутина переживёт уничтожение ViewModel
        GlobalScope.launch {
            val data = repository.fetch()
            _state.value = data  // NPE или crash после onCleared()
        }
    }
}

GlobalScope и его проблемы

GlobalScope — это синглтон CoroutineScope, привязанный к жизни всего приложения. Корутины, запущенные в нём, живут, пока живёт JVM/приложение, и их нельзя отменить структурированно. Именно поэтому GlobalScope помечен аннотацией @DelicateCoroutinesApi — его использование требует явного осознанного решения.

Почему GlobalScope опасен

  • Нарушение structured concurrency: корутина в GlobalScope не является дочерней ни для какого родительского scope. Если вы закрываете экран, ViewModel, сервис — корутина продолжает жить.
  • Утечки ресурсов: сетевые соединения, держатели блокировок, ссылки на Activity/Fragment не освобождаются, пока корутина не завершится сама.
  • Невозможность тестирования: тест не может получить Job корутины из GlobalScope, дождаться её завершения или отменить её детерминированно.
  • Неявный диспетчер: по умолчанию — Dispatchers.Default, что может быть неожиданным.

Правильная альтернатива — viewModelScope

class MyViewModel : ViewModel() {
    fun loadData() {
        // ХОРОШО: корутина отменяется при onCleared()
        viewModelScope.launch {
            val data = repository.fetch()
            _state.value = data
        }
    }
}

Когда GlobalScope всё же допустим

Есть редкие случаи, когда GlobalScope оправдан:

  • Корутина действительно должна жить всё время работы приложения (фоновый daemon-процесс, top-level сервис мониторинга).
  • Код в main() серверного приложения без собственного lifecycle-scope.
  • Явно одноразовые fire-and-forget операции, потеря которых не критична.

Альтернативы для разных контекстов

// Android ViewModel
viewModelScope.launch { /* отменяется с ViewModel */ }

// Android Fragment/Activity
lifecycleScope.launch { /* отменяется с lifecycle */ }
lifecycleScope.launchWhenStarted { /* приостанавливается в STOPPED */ }

// Ktor / серверный код — собственный scope
val appScope = CoroutineScope(SupervisorJob() + Dispatchers.Default)
appScope.launch { /* управляемый scope */ }

// Тесты
TestScope().launch { /* детерминированный clock */ }

// Самостоятельный scope с явной отменой
class MyService {
    private val scope = CoroutineScope(SupervisorJob() + Dispatchers.IO)

    fun start() { scope.launch { doWork() } }
    fun stop()  { scope.cancel() }
}

Как компилятор предупреждает

@OptIn(DelicateCoroutinesApi::class)
GlobalScope.launch { /* явно опт-ин */ }

Без @OptIn IDE покажет предупреждение. Наличие @OptIn в коде — сигнал для ревьюера: «автор знал, что делает».

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

  • Утечка Activity: захват this (Activity/Fragment) в лямбде GlobalScope.launch → OutOfMemory после поворота экрана.
  • Тихий сбой после отмены контекста: обновление UI-элементов после их уничтожения приведёт к краш-репортам в продакшне.
  • Скрытые зависимости: unit-тест завершается, но корутина GlobalScope ещё работает — тест проходит, а побочный эффект случается после assert.
  • Диспетчер по умолчанию: GlobalScope использует EmptyCoroutineContext, что означает Dispatchers.Default. IO-задачи там займут thread pool, предназначенный для вычислений.
  • Цепочка отмены рвётся: даже если родительский Job отменён, дочерняя GlobalScope-корутина этого не «почувствует» — она не является дочерней.
  • Тестирование с runTest: runTest (kotlinx-coroutines-test) контролирует только корутины внутри TestScope. GlobalScope-корутины выполняются вне его — тесты становятся недетерминированными.

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

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

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

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

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

  • Формулирует суть темы «GlobalScope» своими словами и связывает ее с кодом.
  • Называет механизм: Он допустим только для явно process-wide задач с собственным error handling и shutdown strategy.
  • Видит production-последствие: В обычном use case GlobalScope приводит к утечкам, потерянным исключениям и операциям после отмены запроса.

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

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

Источники

  • https://kotlinlang.org/docs/coroutines-basics.html
←Предыдущий вопросЧто такое операторы flow и приведите примеры (`map`, `filter`, `flatMapConcat`, `zip`, `combine`)?Следующий вопрос→Как работает обработка исключений в coroutines? В чём разница между `launch` и `async` при возникновении исключений?

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

Kotlin Coroutinesconcurrencyglobal-scope-reasoningkotlin coroutines