Диспетчер сопрограмм не может переходить из одной подпрограммы в другую в любом месте вашего кода (как это делают потоки). Весь неподдерживающий (блокирующий) код в сопрограмме вызывается сразу, и только когда сопрограмма приостановлена , диспетчер может позволить другой сопрограмме выполнять свою работу в том же потоке.
Это означает, что ваша функция calculate
должна приостановить вашу сопрограмму в некоторых точках - для вашего случая вы должны вызывать функцию приостановки yield()
, например, после каждой итерации l oop. Эта функция возвращает поток сопрограммного диспетчера для выполнения другим сопрограммам.
suspend fun calculate(name: String) {
var value = 0
for (x in 1..1_000){
value += 1
if(x % 100 == 0){
println("calculating $x for $name")
}
yield()
}
}