Во время практики и обучения 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 }
}