728x90
Coroutines
- 비선점 멀티태스킹의 서브루틴 형태 (메인과 서브의 개념이 없다고함)
- 지연과 재개가 가능함
- 협력형 태스크와 비슷하게 동작
코루틴을 사용해서 특정 루틴의 블로킹을 분리하고 비동기적으로 협력형 멀티태스크를 구현
Kotlin Coroutines
- 기본옵션은 협력형이며 병행형으로 동작하지 않음 (옵션은 조절이 가능함)
- 스케쥴러 실행시점을 설정하는 것이 아닌 프로그래머 이벤트에 의해 실행 및 지연(Suspend), 재개(Resume) 시점이 결정
- 비선점형 태스크, 동시성 제공
Coroutines 요소
- CoroutineScope : 코루틴문맥을 실행하기 위한 제한 범위를 지정, 특정한 목적의 Dispatcher를 지정하여 제어 및 동작 가능한 범위
- CoroutineContext : 코루틴을 실행하는 문맥으로 특정 실행 환경을 결정
- CoroutineBuilder : CoroutineScope에서 실행한 코루틴을 지정하고 생성 (launch, async)
- CoroutineDispatcher : 코루틴 실행방식을 담당
CoroutineDispatcher 종류
- Dispatchers.Default : 기본적인 백그라운드 동작
- Dispatchers.IO : I/O에 최적화된 동작
- Dispatchers.Main : 메인 스레드에서 동작
Dispatcher들은 모든 플랫폼에서 지원되지 않아서 지원되는 플랫폼에서 해야함
Kotlin Coroutine 기본 예시
fun main() = runBlocking { // Coroutine Scope
launch { // 새로운 코루틴 객체를 생성 & 해당 코루틴 동작 시작
delay(1000L) // Non-blocking 1초 딜레이 커맨드
println("World!") // 1초 후에 출력됨!
}
println("Hello!") // Main Coroutine 은 delay 되지 않고 이어서 수행됨
}
// 결과
// Hello
// World!
- launch : 코루틴을 만드는 CoroutineBuilder, 해당 코루틴이 속한 쓰레드는 블록킹이 안됨 (launch 스코프내에서 delay를 줘서 Hello가 먼저 출력)
- delay : Suspending되는 일시중단 함수, 쓰레드가 통째로 블록킹되는 것이 아니라 일시중단되는 동안 다른 코루틴이 동작
- runBlocking : 코루틴 요소가 포함되지 않는 일반적인 코드 블럭과 runblocking 스코프내에 코루틴 동작블럭들을 이어줌 (runBlocking 감싸고 있는 영역 자체가 CoroutineScope)
- 실제 프로덕션코드에서는 runBlocking 키워드를 거의 사용하지 않음 (runblocking에 속한 해당 스코프내의 모든 코루틴 동작들이 실행이 완료될때까지 블록킹하는 것이라 비효율적임)
'KOTLIN' 카테고리의 다른 글
[KOTLIN] CANCELLATION (취소) (0) | 2022.06.09 |
---|---|
[KOTLIN] SUSPEND 함수 (0) | 2022.06.06 |
[KOTLIN] NULL SAFTY / NULL 처리방법 (0) | 2022.05.30 |
[KOTLIN] LATEINIT / LAZY (0) | 2022.05.22 |
[KOTLIN] 시퀀스 (SEQUENCES) (0) | 2022.05.22 |