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

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

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

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

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

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

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

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

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

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

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

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

Все подборки
  • Python8 800
  • Облачные технологии6 644
  • QA вакансии2 164
  • Android1 317
  • Инженер данных868
  • Продакт-менеджер314

Разработка

  • iOS1 229
  • Backend вакансии1 199
  • AI вакансии548
  • Fullstack вакансии495
  • Frontend вакансии424
  • Mobile вакансии28

По стеку

  • Go5 236
  • Java3 132
  • Kotlin1 120
  • Node.js1 005
  • Rust852
  • .NET659
  • PHP319
  • C++268
  • C#207

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

  • Kubernetes3 909
  • Linux-инфраструктура2 843
  • DevOps вакансии2 675
  • Terraform / IaC2 175
  • Мониторинг и Observability1 072
  • CI/CD915
  • SRE305
  • Кибербезопасность33

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

  • Аналитик данных532
  • Data Scientist435
  • Бизнес-аналитик400
  • Системный аналитик68

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

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

По регионам

  • Вакансии в США25 825
  • Вакансии в Европе10 301
  • Работа в России3 618
  • Вакансии в Канаде2 268

По формату

  • Удалённые вакансии42 661
  • Релокация в США25 825
  • Гибридная работа5 655
  • Офисная работа4 440

По уровню

  • Senior вакансии22 599
  • Middle вакансии11 490
  • Junior вакансии3 852

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

Все компании
  • Rakuten189 вакансий
  • Wise187 вакансий
  • ASML164 вакансии
  • Grab134 вакансии
  • Celonis47 вакансий
  • Spotify37 вакансий
  • Infobip28 вакансий
  • Adyen27 вакансий
  • Monzo19 вакансий
  • Darktrace17 вакансий

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

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

Что такое модель акторов (actor model) и как её реализовать с помощью coroutines?

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

Модель акторов — паттерн конкурентности, где актор обрабатывает сообщения последовательно через собственный mailbox; в Kotlin реализуется через Channel или устаревший actor{} builder, а в современном коде — через sealed class + Channel в ViewModel.

Устаревший actor{} builder

В Kotlin Coroutines существует actor() builder, но он помечен @ObsoleteCoroutinesApi:

import kotlinx.coroutines.*
import kotlinx.coroutines.channels.*

sealed class CounterMsg
object IncCounter : CounterMsg()
class GetCounter(val response: CompletableDeferred<Int>) : CounterMsg()

@OptIn(ObsoleteCoroutinesApi::class)
fun CoroutineScope.counterActor() = actor<CounterMsg> {
    var counter = 0
    for (msg in channel) {
        when (msg) {
            is IncCounter -> counter++
            is GetCounter -> msg.response.complete(counter)
        }
    }
}

fun main() = runBlocking {
    val counter = counterActor()
    repeat(1000) {
        counter.send(IncCounter)
    }
    val result = CompletableDeferred<Int>()
    counter.send(GetCounter(result))
    println("Counter: ${result.await()}") // 1000
    counter.close()
}

Модель акторов (Actor Model)

Модель акторов — концепция конкурентного программирования, в которой каждый актор:

  • имеет приватное состояние, недоступное извне
  • общается с другими только через передачу сообщений
  • обрабатывает сообщения строго последовательно (нет race conditions)
  • может создавать новых акторов и отправлять им сообщения

Современная реализация через Channel

Рекомендованная альтернатива — явный Channel с coroutine-обработчиком:

import kotlinx.coroutines.*
import kotlinx.coroutines.channels.*

sealed interface Action {
    data class Deposit(val amount: Int) : Action
    data class Withdraw(val amount: Int) : Action
    data class GetBalance(val deferred: CompletableDeferred<Int>) : Action
}

class AccountActor(scope: CoroutineScope) {
    private val mailbox = Channel<Action>(Channel.UNLIMITED)
    private var balance = 0

    init {
        scope.launch {
            for (action in mailbox) {
                when (action) {
                    is Action.Deposit -> balance += action.amount
                    is Action.Withdraw -> {
                        if (balance >= action.amount) balance -= action.amount
                    }
                    is Action.GetBalance -> action.deferred.complete(balance)
                }
            }
        }
    }

    suspend fun deposit(amount: Int) = mailbox.send(Action.Deposit(amount))
    suspend fun withdraw(amount: Int) = mailbox.send(Action.Withdraw(amount))
    suspend fun getBalance(): Int {
        val d = CompletableDeferred<Int>()
        mailbox.send(Action.GetBalance(d))
        return d.await()
    }
    fun close() = mailbox.close()
}

fun main() = runBlocking {
    val account = AccountActor(this)
    repeat(100) { launch { account.deposit(10) } }
    println("Balance: ${account.getBalance()}") // 1000
    account.close()
}

Применение в Android ViewModel

class CartViewModel : ViewModel() {
    private val _state = MutableStateFlow(CartState())
    val state: StateFlow<CartState> = _state.asStateFlow()

    // Mailbox актора
    private val actions = Channel<CartAction>(Channel.UNLIMITED)

    init {
        viewModelScope.launch {
            for (action in actions) {
                _state.update { reducer(it, action) }
            }
        }
    }

    fun dispatch(action: CartAction) {
        actions.trySend(action) // не suspend — безопасно из UI
    }

    private fun reducer(state: CartState, action: CartAction): CartState =
        when (action) {
            is CartAction.AddItem -> state.copy(items = state.items + action.item)
            is CartAction.RemoveItem -> state.copy(items = state.items - action.item)
        }
}

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

  • actor{} builder помечен @ObsoleteCoroutinesApi — может быть удалён в будущих версиях.
  • Неограниченный (UNLIMITED) канал может привести к OutOfMemoryError при медленном потребителе.
  • Отправка в закрытый канал бросает ClosedSendChannelException — нужно обрабатывать после cancel.
  • CompletableDeferred для запросов-ответов не имеет таймаута — используйте withTimeout вокруг await().
  • Актор не даёт backpressure по умолчанию — медленный актор накапливает сообщения без ограничений.
  • Ошибка внутри обработчика сообщений завершает весь цикл for — нужно обернуть в try/catch.
  • Разделение нескольких Channel между coroutines без явной документации превращает код в запутанную сеть зависимостей.

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

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

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

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

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

  • Формулирует суть темы «actor model на coroutines» своими словами и связывает ее с кодом.
  • Называет механизм: На kotlinx.coroutines это обычно Channel плюс loop receive, где все mutation происходят внутри владельца состояния.
  • Видит production-последствие: Actor может стать бутылочным горлышком, а неверная стратегия закрытия mailbox теряет сообщения.

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

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

Источники

  • https://kotlinlang.org/docs/channels.html

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

Kotlin Coroutinesactor-model-reasoningconcurrencykotlin coroutines