Таймаут в Kotlin
Иногда шаг не должен длиться дольше заданного
интервала. Функция withTimeout принимает лимит в
миллисекундах и выполняет suspend-блок.
Если работа уложилась, возвращается результат
лямбды. Если нет - бросается
TimeoutCancellationException.
Короткий лимит и длинная пауза внутри приводят к срыву по времени:
import kotlinx.coroutines.delay
import kotlinx.coroutines.runBlocking
import kotlinx.coroutines.withTimeout
fun main() {
runBlocking {
try {
withTimeout(50) {
delay(200)
println("late")
}
} catch (_: Exception) {
println("timeout")
}
}
}
Строка "late" не печатается: delay
не успевает завершиться до истечения 50
мс. В catch попадает исключение таймаута.
При достаточном лимите блок доходит до конца и возвращает значение, как обычная лямбда:
import kotlinx.coroutines.delay
import kotlinx.coroutines.runBlocking
import kotlinx.coroutines.withTimeout
fun main() {
runBlocking {
val code = withTimeout(500) {
delay(20)
"OK"
}
println(code)
}
}
Оберните паузу на 300 миллисекунд в
лимит 100 мс. Поймайте сбой и выведите
"slow".
В лимите 200 мс верните строку
"fast" после короткой паузы. Напечатайте
полученное значение.