tgoop.com/kotlin_lib/527
Create:
Last Update:
Last Update:
Объяснение отмены корутин в Kotlin
Kotlin корутины предоставляют удобный способ асинхронного программирования. Но с этим удобством приходит и необходимость понять, как работает отмена. Давайте разберемся, как именно происходит отмена корутин и что это означает для вашего кода.
Что происходит при отмене?
Когда Job
отменяется, он переводится в состояние "отменено", но фактически корутина не завершится мгновенно. Она завершится, когда достигнет "точки отмены" (cancellation point). Это может быть:
- Вызов delay
, yield
и других suspend-функций, проверяющих isActive
.
- Явная проверка coroutineContext.isActive
или вызов ensureActive()
.
Пример:
launch {
repeat(1000) { i ->
println("I'm sleeping $i ...")
delay(500L)
}
}
Если вы вызовете
cancel()
на этой корутине, она остановится только после следующего delay
.Отмена и finally
try/finally
блоки работают в корутинах, как и ожидалось. Однако, если вы используете delay
или другую suspend-функцию в finally
, она тоже может быть отменена. Чтобы избежать этого, используйте withContext(NonCancellable)
:
try {
// работа
} finally {
withContext(NonCancellable) {
// гарантированно выполнится
}
}
Пример отмены
val job = launch {
try {
repeat(1000) { i ->
println("Job: I'm sleeping $i ...")
delay(500L)
}
} finally {
println("Job: I'm running finally")
}
}
delay(1300L) // немного подождем
println("main: I'm tired of waiting!")
job.cancelAndJoin() // отмена и ожидание завершения
println("main: Now I can quit.")
Вывод:
Job: I'm sleeping 0 ...
Job: I'm sleeping 1 ...
Job: I'm sleeping 2 ...
main: I'm tired of waiting!
Job: I'm running finally
main: Now I can quit.
Как видно,
finally
выполнится при отмене, но если в нем будет suspend-функция — нужно быть осторожным.Заключение
Понимание механизма отмены корутин — важная часть работы с асинхронным кодом в Kotlin. Отмена не означает мгновенное завершение — корутина завершится в точке отмены. Используйте
NonCancellable
, если нужно завершить работу "честно", несмотря на отмену.https://sam-cooper.medium.com/kotlin-coroutine-cancellation-explained-6a545c8da252
✍️ @kotlin_lib
BY Kotlin

Share with your friend now:
tgoop.com/kotlin_lib/527