KOTLIN_LIB Telegram 527
Объяснение отмены корутин в 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
👍3



tgoop.com/kotlin_lib/527
Create:
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

View MORE
Open in Telegram


Telegram News

Date: |

A vandalised bank during the 2019 protest. File photo: May James/HKFP. 1What is Telegram Channels? Choose quality over quantity. Remember that one high-quality post is better than five short publications of questionable value. Joined by Telegram's representative in Brazil, Alan Campos, Perekopsky noted the platform was unable to cater to some of the TSE requests due to the company's operational setup. But Perekopsky added that these requests could be studied for future implementation. In the “Bear Market Screaming Therapy Group” on Telegram, members are only allowed to post voice notes of themselves screaming. Anything else will result in an instant ban from the group, which currently has about 75 members.
from us


Telegram Kotlin
FROM American