- co-routine = 협력하는 루틴
- 일반적인 함수의 협력과 코루틴은 어떻게 다른가?
- 루틴에 진입하는 곳이 한 군데이며, 종료되면 해당 루틴의 정보가 초기화된다.
- 스코프 안에서 하나의 함수 실행이 종료되었을 때, 언젠가 가비지 컬렉션에 의해 정리되는 것 처럼
org.jetbrains.kotlinx:kotlinx-coroutines-core
의존성 필요
fun main(): Unit = runBlocking {
println("START")
launch {
newRoutine()
}
yield()
println("END")
}
suspend fun newRoutine() {
val num1 = 1
val num2 = 2
yield()
println("${num1 + num2}")
}
runBlocking
: 일반 스코프와 코루틴 스코프를 연결한다. 이 함수를 사용했을 때 새로운 코루틴을 만든다.
launch
: 반환 값이 없는 코루틴을 만든다. 코루틴을 즉시 실행하지 않고, 예약된 작업으로 실행 대기 상태가 된다.
suspend fun
: 다른 suspend fun 을 호출할 수 있다.
yield
: 현재 코루틴을 중단하고, 다른 코루틴을 실행할 수 있도록 스레드를 양보하는 suspend 함수다.
- 코루틴은 중단/재개될 수 있으므로, 해당 루틴에서 사용했떤 정보들을 메모리에 보관하고 있어야한다.
- 루틴: 시작되면 끝날 때 까지 멈추지 않는다. 한번 종료되면 루틴 정보가 사라짐
- 코루틴: 중단되었다가 재개될 수 있다. 중단되었을 떄 루틴 정보가 사라지지 않음
graph TD;
subgraph 루틴
A[Main 루틴] -->|1. 진입| B[New 루틴]
B -->|2. 종료| A
end
subgraph 코루틴
C[Main 코루틴] -->|1. 진입| D[New 코루틴]
D -->|"2. yield() 중단"| C
C -->|3. 재개| D
D -->|4. 종료| C
end
- runBlocking의 역할:
runBlocking
은 메인 스레드를 차단(blocking)하여 코루틴이 완료될 때까지 기다리게 합니다. 이는 주로 메인 함수나 테스트 코드에서 사용됩니다. 다른 일반적인 코드에서는 runBlocking을 사용하지 않고 CoroutineScope를 통해 코루틴을 실행합니다.
- launch와 async의 차이:
launch
는 반환 값이 없는 코루틴을 시작하고, async
는 결과 값을 반환하는 코루틴을 시작합니다. async는 Deferred 객체를 반환하며, await를 통해 결과를 받을 수 있습니다.
- 코루틴의 상태 관리: 코루틴은
Job
을 통해 상태를 관리합니다. Job
은 코루틴의 생명주기를 관리하며, 코루틴의 상태(활성, 취소 등)를 추적합니다.
- 코루틴의 장점: 코루틴은 비동기 작업을 쉽게 처리할 수 있도록 도와줍니다. 전통적인 스레드 기반의 비동기 작업보다 메모리 오버헤드가 적고, 코드가 간결해집니다.