-
Kotlin ์ฝ๋ฃจํด(Coroutines)์ Cancellation๊ณผ Timeouts๐ณDev/Dev 2022. 7. 16. 16:39
์์ฐจ์๋์ ์ฝํ๋ฆฐ ์ฝ๋ฃจํด ๊ฐ์๋ฅผ ๋ฃ๊ณ ์ ๋ฆฌํ ๋ด์ฉ์ ๋๋ค
1. Cancellation and Timeouts
1. Cancel
์คํํ ์ฝ๋ฃจํด์ ์ค๋จํ๋ ๋ฐฉ๋ฒ : ๋ฐ๋ก cancel ํจ์๋ฅผ ํตํด์ ๊ฐ๋ฅํ๋ค!
import kotlinx.coroutines.* fun main() =runBlocking{ val job = launch{ repeat(5) { i -> println("Coroutine A, $i") delay(500L) } } delay(1000L) println("tired") job.cancel() job.join() println("quit") }
ํ์ง๋ง cancel๋ ์ ์ฉ๋๋ ์กฐ๊ฑด์ด ์ฃผ์ด์ง๋ค.
์ผ๋จ ์ฝ๋ฃจํด ์ฝ๋๊ฐ ํ์กฐ์ ์ผ ํ์๊ฐ ์๋ค. ์ฝ๋๋ฅผ ์งค ๋ ์๋์ ์์๋ค์ ์๊ฐํ๋ฉด์ ์ง๋ณด์.
- ์ฃผ๊ธฐ์ ์ผ๋ก suspend ํจ์ ์ฌ์ฉ
- suspend ํจ์๋ ์ทจ์๊ฐ ๊ฐ๋ฅํ๋ค
- isActive ๋ณ์๋ฅผ ์ฌ์ฉํ์ฌ ๋ช ์์ ์ผ๋ก ์ํ๋ฅผ ์ฒดํฌ
1. suspend ํจ์๋ฅผ ์ฌ์ฉํ cancel
์๋ ์ฝ๋๋ ์๋ํ ๋๋ก ์ข ๋ฃํ์ง ์๋๋ค.
import kotlinx.coroutines.* fun main() =runBlocking{ val startTime = System.currentTimeMillis() val job =launch(Dispatchers.Default){ var nextPrintTime = startTime var i =0 while(i < 5){ if (System.currentTimeMillis() >= nextPrintTime){ println("Job : I am sleeping ${i++}") nextPrintTime += 500L } } } delay(1300L) println("tired") job.cancelAndJoin() println("quit") }
์ค์? ์ ๊ทธ๋ฌ์ง
์ด๋ ๋ฐ๋ก, launch ๋ด๋ถ์ suspend ํจ์๊ฐ ์๊ธฐ ๋๋ฌธ์ด๋ค!
์ด๋ ์๋ ์ธํ ๋ฆฌ์ ์ด์์ ๋ ์ ํ์ธํ ์ ์๋ค.
๊ฐ์ฅ ์ผ์ชฝ์ ์ด๋ก ๊ณก์ ์ด ์๋ ํ์ดํ๊ฐ suspend ํจ์๋ฅผ ์๋ฏธํ๋ค.
์์ main์ suspend ํจ์์ธ delay()๋ฅผ launch ํจ์ ์์ ์ฌ์ฉํ๊ณ , ์๋ main์ ์ ํ ์ฌ์ฉํ์ง ์์๋ค.
๊ทธ๋์ ์ main๊ณผ ๋ค๋ฅด๊ฒ ์๋ main์ ์๋ํ ๋๋ก ์๋ํ์ง ์๋๋ค.
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด suspend ํจ์๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋๋ฐ,
์ด๋ yield()๋ ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค.
yield๋ Exception๊ณผ ํจ๊ป ๋ฐํ๋์ด, ์์ธ๋ฅผ ๋ฐ๊ณ ์ถ๋ค๋ฉด try catch๋ฌธ์ ์ฌ์ฉํ๋ฉด ๋๋ค.
import kotlinx.coroutines.* fun main() =runBlocking{ val startTime = System.currentTimeMillis() val job =launch(Dispatchers.Default){ try { var nextPrintTime = startTime var i = 0 while (i < 5) { if (System.currentTimeMillis() >= nextPrintTime) { yield() println("Job : I am sleeping ${i++}") nextPrintTime += 500L } } } catch (e: Exception) { println("Exception $e") } } delay(1300L) println("tired") job.cancelAndJoin() println("quit") }
2. isActive ๋ณ์๋ฅผ ์ฌ์ฉํ cancel
์ํ ๋ณ์๋ฅผ ์ฌ์ฉํด์๋ cancel์ด ๊ฐ๋ฅํ๋ค.
isActive ๋ณ์๋ cancel()๊ฐ ํธ์ถ๋๋ฉด true์์ false๋ก ๋ฐ๋๋ค.
import kotlinx.coroutines.* fun main() =runBlocking{ val job =launch(Dispatchers.Default){ var i = 0 println("Before : isActive $isActive") while (isActive) { println("Job : I am sleeping ${i++}") } println("After : isActive $isActive") } delay(1L) println("tired") job.cancelAndJoin() println("quit") }
3. Closing resources with finally
์ฝ๋ฃจํด์ ์ข ๋ฃํ ๋ ๋ฆฌ์์ค๋ฅผ ํด์ ํ๊ธฐ ์ํด try-finally ๊ตฌ๋ฌธ์ ์ฌ์ฉํ๋ค.
import kotlinx.coroutines.* fun main() =runBlocking{ val job =launch{ try { repeat(5){i-> println("Coroutine A, $i") delay(500L) } } finally { println("I am running finally") } } delay(1000L) println("tired") job.cancelAndJoin() println("quit") }
4. Run non-cancellable bloc
์ทจ์ ๋ ์ฝ๋ฃจํด ์์์ ์ฝ๋ฃจํด์ผ๋ก suspend ํด์ผ ํ ๊ฒฝ์ฐ, ์ฆ finally ์์์ ์ฝ๋ฃจํด์ ๋ถ๋ฌ์ค๋ ๊ฒฝ์ฐ
๋ ์์ฒญ ๋ ์ดํ๊ฒ ์กด์ฌํ๋ค.
import kotlinx.coroutines.* fun main() =runBlocking{ val job =launch{ try { repeat(5){i-> println("Coroutine A, $i") delay(500L) } } finally { withContext(NonCancellable){ println("Job : I am running finally") delay(1000L) println("Job : and Just Delay") } } } delay(1000L) println("tired") job.cancelAndJoin() println("quit") }
2. Timeout
cancel์ ์ฌ์ฉํ์ง ์๊ณ ๋, ์ ํด์ง ์๊ฐ์ด ๋๋ฉด ์ฝ๋ฃจํด์ด cancel๋๋ ๋งค์ง
1. withTimeout
import kotlinx.coroutines.* fun main() =runBlocking{ withTimeout(1300L){ repeat(100){i-> println("I am Sleeping, $i") delay(500L) } } }
ํ์ง๋ง ์ฝ๋ฃจํด ์ข ๋ฃ์ ๋์์ TimeoutCancellationException์ ๋ฐํํ๋ค.
์ด๋ฅผ ๋ณด์ํ ๋ฐฉ๋ฒ์ด Null์ ๋ฐํํ๋ ๊ฒ!
2. withTimeoutOrNull
import kotlinx.coroutines.* fun main() =runBlocking{ val result = withTimeoutOrNull(1300L){ repeat(100){i-> println("I am Sleeping, $i") delay(500L) } } println("result id $result") }
์ด๋ ๊ฒ null์ ๋ฐํํ๋ฉด์ Timeout์ด ์คํ๋์ด ์ฝ๋ฃจํด์ด ์ข ๋ฃ๊ฐ ๋๋ค.
์ฐธ์กฐ
์์ฐจ์์ ์ฝํ๋ฆฐ ์ฝ๋ฃจํด(Coroutines) ๊ฐ์ข
์์ฐจ์์ ์ฝํ๋ฆฐ ์ฝ๋ฃจํด(Coroutines) ๊ฐ์ข
www.youtube.com
'๐ณDev > Dev' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Kotlin ์ฝ๋ฃจํด(Coroutines)์ Context and Dispatchers (0) 2022.07.16 Kotlin ์ฝ๋ฃจํด(Coroutines)์ Suspending Functions (0) 2022.07.16 Kotlin ์ฝ๋ฃจํด(Coroutines)์ ๊ฐ๋ ๊ณผ ๊ธฐ๋ณธ ์ฌ์ฉ๋ฒ (0) 2022.07.16 PostGIS๊ณผ Hibernate-Spatial๋ก ๊ณต๊ฐ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃจ๊ธฐ (0) 2022.07.16 Hibernate-Spatial๋ฅผ spring.jpa.properties.hibernate.dialect๋ก ์ฐ๊ฒฐํ ๋ (+deprecated) (0) 2022.07.10 - ์ฃผ๊ธฐ์ ์ผ๋ก suspend ํจ์ ์ฌ์ฉ