Kotlin актер сопрограммы и проблемы параллелизма - PullRequest
1 голос
/ 09 ноября 2019

Рассматривая пример https://github.com/kotlin/kotlinx.coroutines/blob/master/kotlinx-coroutines-core/jvm/test/guide/example-sync-07.kt, а точнее следующий фрагмент

// This function launches a new counter actor
fun CoroutineScope.counterActor() = actor<CounterMsg> {
    var counter = 0 // actor state
    for (msg in channel) { // iterate over incoming messages
        when (msg) {
            is IncCounter -> counter++
            is GetCounter -> msg.response.complete(counter)
        }
    }
}

Не могу не заметить, что, если, например, 5 других сопрограмм отправят сообщение GetCounter вышеприведенному субъекту, онибудет «обслуживаться» последовательно один за другим, т.е. параллелизм не достигается. Несмотря на то, что у нас есть ЦП с 8 физическими потоками, каждая из «клиентских» сопрограмм, считывающих значение счетчика, будет ограничена последовательным выполнением сопрограммы актера.

Как можно избежать этой последовательной обработки при использовании сопрограммы актера?

Спасибо

...