1. runblocking이란
runBlocking
은 비동기 코드를 동기적인 환경으로 가져오는 역할을 한다.
launch, async, produce
는 비동기 코드를 동기 코드처럼 사용할 수 있게 해주는 도구다. 반면 runBlocking은 비동기 코드를 완전히 동기 코드로 변환해주는 특별한 도구다.
예를 들어, 1초 동안 대기하는 delay(1000)이라는 비동기 함수가 있다. 이 함수는 코루틴 안에서만 사용 가능하기 때문에 동기 코드 환경에서는 실행할 수 없다. 하지만 runBlocking으로 delay(1000)을 감싸면 이 비동기 함수는 동기 코드처럼 실행된다. 이렇게 runBlocking은 비동기 작업을 동기적으로 사용할 수 있게 해준다.
2. 예제
import kotlinx.coroutines.*
fun main() {
println("Task a: Start")
println("Task b: Start")
runBlocking {
println("Task c: runBlocking Start")
launch {
delay(1000L)
println("Task d: Coroutine 1 Complete")
}
launch {
delay(500L)
println("Task e: Coroutine 2 Complete")
}
println("Task f: runBlocking End")
}
println("Task g: Start")
}
// 출력
1. Task a와 Task b는 메인 스레드에서 순차적으로 실행된다.
2. Task c는 runBlocking 블록이 시작되면서 출력된다.
3. runBlocking 블록 내부에서:
3-1. 첫 번째 launch는 1초 뒤에 Task d를 출력한다.
3-2. 두 번째 launch는 0.5초 뒤에 Task e를 출력한다.
4. Task f는 두 개의 launch가 시작된 직후 실행된다. launch는 비동기적으로 실행되기 때문에 바로 진행된다.
5. Task g는 runBlocking 블록이 종료된 후, 메인 스레드에서 실행된다.
3. 주의점
runBlocking은 주로 코드 테스트나 디버깅 상황에서 많이 쓰인다. 동기 코드 안에서 간단하게 코루틴 코드를 실행할 수 있는 장점이 있다.
하지만 메인 스레드를 차단하기 때문에 성능 저하가 발생할 수 있기 때문에 실무에서 사용할 때는 신중해야 한다.
'개념 저장소 > coroutine' 카테고리의 다른 글
구조화된 동시성 (2) | 2024.12.21 |
---|---|
Coroutine Context (1) | 2024.12.12 |
Deferred, async/await, withContext (0) | 2024.12.09 |
Job과 코루틴 제어 (0) | 2024.12.08 |
Dispatcher (2) | 2024.12.07 |