일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- kotlin
- resizer 구현
- 코틀린
- InnoDB
- Pitest
- go https 구현
- 오블완
- Mutation testing
- 자바
- AES-GCM
- 직접 코드로 구현
- ruby
- standard input
- https go
- IntelliJ
- https implement
- HTTPS
- cli 만들기
- MySQL
- Java
- resize image with go
- 대칭 키 알고리즘
- standard output
- 객체지향
- https 실습
- https 서버 구현
- Test
- 돌연변이 테스팅
- image resizer with go
- JPA
- Today
- Total
Rlog
CoroutineScope 과 Runblocking 의 차이 본문
CoroutineScope VS Runblocking
Kotlin Coroutines 을 학습했다면 위와 같은 고민을 하고 있을 가능성이 높다고 생각한다. 도대체 둘의 차이는 무엇일까? 일단 아래 예시 코드를 한번 보자.
// 1번 코드
fun main() = runBlocking {
val a = coroutineScope {
delay(3000)
10
}
println("a is calculated")
val b = coroutineScope {
delay(3000)
20
}
println(a) // 10
println(b) // 20
}
// 2번 코드
fun main() = runBlocking {
val a = runBlocking {
delay(5000)
10
}
println("a is calculated")
val b = runBlocking {
delay(5000)
20
}
println(a) // 10
println(b) // 20
}
이 포스트를 이해하기 위해서는 최소, 지금 1번 코드와 2번코드가 어떻게 도는지는 알고 있어야 한다. 일단 결과를 말해주자면 둘다 같은 결과가 나온다. 그렇다면 CoroutineScope 와 runBlocking 은 무슨 차이가 있는 것일까?
Runblocking
일단 RunBlocking Code 의 주석 중 일부를 발췌해보겠다.
Runs a new coroutine and blocks the current thread interruptibly until its completion.
위의 영어를 해석해보면 현재 Thread 를 작업이 완료될때까지 Blocking 한다는 것을 알 수 있다. 즉, Runblocking 은 Suspend Function 이 아니다. 기존에 Java 에서 우리가 동기 처리를 하기 위해 Thread 를 끝날때까지 Blocking 하는 것과 같은 역할을 하는 것이다. 그럼 반대로 CoroutineScope 는 어떨까?
CoroutineScope
CoroutineScope 의 코드 일부를 보자.
public suspend fun <R> coroutineScope(block: suspend CoroutineScope.() -> R): R {
contract {
callsInPlace(block, InvocationKind.EXACTLY_ONCE)
}
return suspendCoroutineUninterceptedOrReturn { uCont ->
val coroutine = ScopeCoroutine(uCont.context, uCont)
coroutine.startUndispatchedOrReturn(coroutine, block)
}
}
위의 함수명만 봐도 알 수 있듯이 suspend Function 이다. 즉 coroutineScope 야 말로, Coroutine 을 제대로 이용할 수 있는 함수이다.
그렇다면 왜 runBlocking 이 존재?
앞서 말했듯이, 우리가 Thread 를 Blocking 해야 하는 상황이 반드시 생긴다. suspend 함수는 Thread 를 Blocking 시키지 않는다는 큰 장점이 있지만, 그와 반대로 Main Thread 가 그대로 흘러가서 Application 이 죽을 수 있다는 단점 또한 존재한다. 따라서 runblocking 을 사용해야 하는 상황이 나온다.
'Kotlin' 카테고리의 다른 글
코드스피츠 6강) 코루틴 (0) | 2022.07.07 |
---|---|
코루틴 빌더 예외처리 (0) | 2022.07.07 |
Kotlin Coroutine Exception Handling (0) | 2022.07.05 |
Kotlin Coroutine Job (0) | 2022.07.01 |
Kotlin) 변성 (0) | 2022.06.30 |