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

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

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

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

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

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

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

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

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

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

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

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

Все подборки
  • Python9 224
  • Облачные технологии4 076
  • QA вакансии1 588
  • Android1 322
  • Инженер данных805
  • Продакт-менеджер368

Разработка

  • Backend вакансии1 317
  • iOS1 239
  • AI вакансии608
  • Fullstack вакансии523
  • Frontend вакансии456
  • Mobile вакансии28

По стеку

  • Go5 445
  • Java3 175
  • Kotlin1 119
  • Node.js1 026
  • Rust949
  • .NET666
  • PHP311
  • C#210
  • C++204

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

  • DevOps вакансии2 713
  • Kubernetes2 308
  • Linux-инфраструктура1 890
  • Terraform / IaC1 406
  • CI/CD842
  • Мониторинг и Observability645
  • SRE226
  • Кибербезопасность84

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

  • Аналитик данных483
  • Data Scientist469
  • Бизнес-аналитик349
  • Системный аналитик48

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

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

По регионам

  • Вакансии в США24 791
  • Вакансии в Европе9 439
  • Работа в России2 924
  • Вакансии в Канаде2 178

По формату

  • Удалённые вакансии43 505
  • Релокация в США24 791
  • Гибридная работа3 370
  • Офисная работа2 525

По уровню

  • Senior вакансии20 898
  • Middle вакансии12 438
  • Junior вакансии3 864

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

Все компании
  • Wise191 вакансия
  • Rakuten188 вакансий
  • ASML163 вакансии
  • Grab134 вакансии
  • Celonis48 вакансий
  • Spotify37 вакансий
  • Adyen28 вакансий
  • Infobip28 вакансий
  • Monzo20 вакансий
  • Darktrace17 вакансий

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

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

Что такое Deferred<T> и как использовать await()?

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

Deferred<T> — результат async-корутины; await() приостанавливает вызывающую корутину до получения значения, не блокируя поток. Несколько Deferred запускают задачи параллельно, а awaitAll() ждёт их все сразу.

Базовый пример

import kotlinx.coroutines.*

fun main() = runBlocking {
    val deferred: Deferred<Int> = async {
        delay(500)
        42
    }
    println("Waiting...")
    val result = deferred.await()   // приостанавливается, не блокирует поток
    println("Result: $result")      // Result: 42
}

Deferred<T> — отложённый результат корутины

Deferred<T> — это интерфейс из пакета kotlinx.coroutines, расширяющий Job. Он представляет корутину, которая в итоге вернёт значение типа T. Создаётся строителем async { ... }, который немедленно запускает корутину в фоне, а не блокирует поток.

Ключевые методы

  • await() — suspend-функция, приостанавливает текущую корутину до получения результата. Если корутина завершилась исключением, оно пробрасывается в вызывающем месте.
  • getCompleted() — возвращает результат без suspend; бросает исключение, если корутина ещё не завершилась.
  • isCompleted, isCancelled, isActive — свойства состояния, аналогичные Job.
  • cancel() — отменяет корутину, не ожидая результата.

Параллельная декомпозиция

Главная ценность async/await — запускать несколько независимых задач параллельно и потом объединять их результаты.

suspend fun fetchUserAndOrders(userId: String): Pair<User, List<Order>> =
    coroutineScope {                          // структурированный контекст
        val userDeferred = async { userRepo.find(userId) }
        val ordersDeferred = async { orderRepo.findByUser(userId) }
        userDeferred.await() to ordersDeferred.await()
    }

Здесь оба вызова БД идут параллельно. Общее время — max(t1, t2), а не t1 + t2.

await() с таймаутом

val result = withTimeout(2000L) {
    deferred.await()      // бросает TimeoutCancellationException при превышении
}

awaitAll для коллекций

val deferreds: List<Deferred<Int>> = ids.map { id ->
    async { fetchScore(id) }
}
val scores: List<Int> = deferreds.awaitAll()   // extension из kotlinx.coroutines

Ленивый запуск

val lazy = async(start = CoroutineStart.LAZY) {
    heavyComputation()
}
// корутина запускается только при вызове await() или start()
lazy.start()           // явный запуск без ожидания
val v = lazy.await()   // или запуск + ожидание

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

  • Потеря исключения без await. Если не вызвать await(), исключение внутри async-блока не распространится автоматически — оно «зависнет» в Deferred и проявится только при вызове await(). Это отличие от launch, где исключение сразу идёт в CoroutineExceptionHandler.
  • Вызов await() вне coroutine scope. await() — suspend-функция; вызов из обычного кода не скомпилируется. Нужен runBlocking или другой coroutine builder.
  • async вне coroutineScope. Запуск async напрямую в GlobalScope лишает структурированного параллелизма: утечки корутин, невозможность отмены родителем.
  • Последовательный await вместо параллельного. val a = async { ... }.await(); val b = async { ... }.await() — это последовательно. Нужно сначала создать оба Deferred, потом оба await().
  • Игнорирование отмены. Если вызвать deferred.cancel(), а потом await(), будет брошено CancellationException. Обрабатывайте его явно или используйте runCatching.
  • Неправильная обработка ошибок при awaitAll. Если один из Deferred в списке упал, awaitAll() отменяет остальные и пробрасывает исключение первого упавшего.

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

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

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

  • Формулирует суть темы «Deferred и await()» своими словами и связывает ее с кодом.
  • Называет механизм: await suspend-ится до завершения Deferred и либо возвращает T, либо выбрасывает сохраненное исключение.
  • Видит production-последствие: Повторный await безопасен для результата, но ленивые Deferred и забытый await делают поток выполнения неочевидным.

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

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

Источники

  • https://kotlinlang.org/docs/composing-suspending-functions.html
←Предыдущий вопросКак работает обработка исключений в coroutines? В чём разница между `launch` и `async` при возникновении исключений?Следующий вопрос→Как обрабатывать ошибки в Flow с помощью оператора `catch`?

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

Kotlin Coroutinesconcurrencydeferred-await-reasoningkotlin coroutines

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

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