Kotlin сопрограмм висит на несколько минут - PullRequest
1 голос
/ 18 февраля 2020

Во время практики и обучения Kotlin Я протестировал несколько методов запуска параллельных рабочих. В параметре when оператор 4 иногда зависает на полпути при вычислении benchedVals и загрузка ЦП падает до 0%. Через пару минут вычисление возобновляется. Опция 5 никогда не зависает таким образом, дети завершают свою работу через несколько секунд, пока основной поток ждет, а затем основной поток возобновляется.

Я не уверен, какая разница между ними, которая заставляет одного повесить, но не другой.

import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.async
import kotlinx.coroutines.runBlocking
import java.util.concurrent.atomic.AtomicLong
import kotlin.time.Duration
import kotlin.time.ExperimentalTime
import kotlin.time.measureTime

@ExperimentalTime
fun run(toRun: Int, totalParallel: Long = 10_000_000L): Pair<Duration, Long> {
    val c = AtomicLong()
    val time = measureTime {
        when (toRun) {
            4 -> {
                val deferred = (1..totalParallel).map { i ->
                    GlobalScope.async {
                        c.addAndGet(i)
                    }
                }
                runBlocking {
                    deferred.map { it.await() }
                }
            }
            5 -> {
                val workers = GlobalScope.launch {
                    for (i in 1..totalParallel) {
                        launch {
                            c.addAndGet(i)
                        }
                    }
                }
                runBlocking { workers.join() }
            }
        }

    }
    return Pair(time, c.get())
}

@ExperimentalTime
fun main(args: Array<String>) {
    val benchedVals = (0 until 1000).map { println(it); run(4, 1000).first }
}
...