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: |

Telegram offers a powerful toolset that allows businesses to create and manage channels, groups, and bots to broadcast messages, engage in conversations, and offer reliable customer support via bots. Earlier, crypto enthusiasts had created a self-described “meme app” dubbed “gm” app wherein users would greet each other with “gm” or “good morning” messages. However, in September 2021, the gm app was down after a hacker reportedly gained access to the user data. How to Create a Private or Public Channel on Telegram? A Hong Kong protester with a petrol bomb. File photo: Dylan Hollingsworth/HKFP. fire bomb molotov November 18 Dylan Hollingsworth yau ma tei
from us


Telegram Kotlin
FROM American