KOTLIN

[KOTLIN] 코루틴

집한구석 2022. 6. 1. 21:06
728x90

Coroutines

  • 비선점 멀티태스킹의 서브루틴 형태 (메인과 서브의 개념이 없다고함)
  • 지연과 재개가 가능함
  • 협력형 태스크와 비슷하게 동작

코루틴을 사용해서 특정 루틴의 블로킹을 분리하고 비동기적으로 협력형 멀티태스크를 구현


Kotlin Coroutines

  • 기본옵션은 협력형이며 병행형으로 동작하지 않음 (옵션은 조절이 가능함)
  • 스케쥴러 실행시점을 설정하는 것이 아닌 프로그래머 이벤트에 의해 실행 및 지연(Suspend), 재개(Resume) 시점이 결정
  • 비선점형 태스크, 동시성 제공

Coroutines 요소

https://abhiappmobiledeveloper.medium.com/kotlin-coroutine-basic-1-b929b7f311a

  • 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