- Kotlin에서 비동기 프로그래밍을 구현하기 위한 방법
- 꼭 Kotlin에 한정된건 아니고, 어셈블리어에서부터 적용한 방법이라고 한다
주요 특징
비선점형 방식
- CPU 스케줄링에서 선점형, 비선점형 방식이 있듯, Coroutine에서도 비선점형 방식으로 다른 Coroutin으로 선점, 자동 전환이 발생하지 않는다
- 예시로 Coroutine A는 데이터 다운로드, Coroutine B는 UI 업데이트를 수행한다 치면, A가 다운로드를 완료하거나 스스로 중단(suspend)해야 B로 넘어가게 되며, A가 중간에 끊겨 다운로드를 덜 하게 되는 상황을 방지한다
- 허나 Coroutine A가 시간이 오래 걸리는 경우라면, 비동기 실행으로 A는 A대로 수행, B는 B대로 수행하도록 병행성을 적용할 수도 있다
- 이런 장점은 개발자가 Coroutine의 흐름을 잘 제어할 수 있고, 동작도 예측이 가능한 면이 있다
- 아래 예시 코드와 같이, runBlocking으로 Coroutine의 범위를, launch로 Coroutine을 추가하여 활용한다
fun main() = runBlocking {
val cA = launch {
println("Coroutine A. Start")
delay(1000)
println("Coroutine A. End")
}
val cB = launch {
println("Coroutine B. Start")
delay(1000)
println("Coroutine B. End")
}
cA.join() // Coroutine A의 완료를 기다림
cB.join() // Coroutine B의 완료를 기다림
}
동시성 지원
- 보통 CPU 내 Thread 스케줄러로 여러개의 Thread를 수행하게 되지만, Coroutine은 하나의 Thread 안에서 여러개를 수행할 수 있다
- 이는 Thread 간의 Context Switching이 발생하는걸, Coroutine에선 이런 오버헤드 없이 로직들을 수행할 수 있는 이점이 있다