코루틴이란?
스레드 내에서 동작하는 일시 중단 가능한 작업 단위이며 경량 스레드라고도 불린다.
- 코루틴은 스레드와 달리 컨텍스트 스위칭(Context Switching) 없이 동작할 수 있는데, 이는 한 스레드 내에서 실행되기 때문이다. 이러한 특성으로 인해 스레드 및 메모리 사용이 줄어들고, 개발자가 직접 작업을 스케줄링할 수 있다.
- 코루틴은 비선점형이며 진입과 반환 지점이 여러 개인데, 이는 서브 루틴과 대조된다. 이 특성으로 인해 루틴 간 협력을 통해 비선점적 멀티태스킹이 가능하다.
- 비동기 처리 코드를 순차 코드로 만들 수 있는데, 이는 콜백 구조의 비동기 처리 코드와 대조된다. 순차 코드로 비동기 처리를 작성할 수 있기 때문에 코드의 흐름을 파악하기 쉽다.
- 하나의 스레드 안에서 여러 개의 코루틴이 있을 수 있다.
- 메인 스레드가 Blocking 되는 것을 줄여준다. 즉, 메인 스레드가 장시간 처리 작업으로 인해 UI를 그리지 못해 ANR이 발생할 수 있는 상황을 막아준다.
동시성, Concurrency : 논리적으로 병렬로 작업이 실행되는 것처럼 보이는 것
병렬성, Parallelism : 물리적으로 병렬로 작업이 실행되는 것
동시성 프로그래밍
2개 이상의 프로세스가 동시에 작업을 하는 상태. 2개 이상의 실행 스레드가 필요하나 단일 코어에서는 병렬적으로
실행하는 것이 불가능하다. 따라서 OS가 스케쥴링을 하며 스레드를 교차 배치시켜 병렬적으로 동시에 실행되는 것처럼
보이게 한다.
- 스레드는 교체 시 Context Switching 비용이 발생한다.
- 코루틴은 한 스레드 내에서 다른 코루틴으로 교체되기 때문에 Context Switching 비용이 발생하지 않는다.
비선점적 멀티태스킹
하나의 프로세스가 CPU를 할당받으면 종료되기 전까지 다른 프로세스가 CPU를 강제로 차지할 수 없다.
import kotlinx.coroutines.*
fun main() {
var cnt1 = 0
var cnt2 = 0
println("Main thread is working")
// 첫 번째 코루틴
val job1 = GlobalScope.launch {
println("Coroutine 1 is start")
repeat(5) {
cnt1++;
delay(500) // 0.5초 동안 일시 정지
yield() // 다른 코루틴에게 실행 양보
}
println("Coroutine 1 is done")
}
// 두 번째 코루틴
val job2 = GlobalScope.launch {
println("Coroutine 2 is start")
repeat(5) {
cnt2++;
delay(700) // 0.7초 동안 일시 정지
yield() // 다른 코루틴에게 실행 양보
}
println("Coroutine 2 is done")
}
// 첫 번째 코루틴이 완료될 때까지 대기하고, 두 번째 코루틴 취소
runBlocking {
job1.join() // 첫 번째 코루틴이 완료될 때까지 대기
job2.cancel() // 두 번째 코루틴 취소
println("cnt1: $cnt1, cnt2: $cnt2")
}
println("Main thread is done")
}
// output:
Main thread is working
Coroutine 1 is start
Coroutine 2 is start
Coroutine 1 is done
cnt1: 5, cnt2: 4
Main thread is done
728x90
'Kotlin' 카테고리의 다른 글
변수와 상수 (0) | 2023.11.02 |
---|---|
수신 객체 지정 람다, with 와 apply (0) | 2023.09.08 |
자바 함수형 인터페이스 활용 (0) | 2023.09.07 |
지연 계산 Lazy 컬렉션 연산 (0) | 2023.09.06 |
컬렉션 함수형 API (0) | 2023.09.05 |