본문 바로가기

Kotlin

kotlin Coroutine 쉽게 이해하기 1 - 기본

코루틴이란?

  • 동시성 프로그래밍
  • Context switching 오버헤드가 적은 non-blocking 일종의 경량 thread

기본 코루틴 생성해보기

  • GlobalScope : 이름 그대로  만들어진 코루틴 생명주기가 전체 애플리케이션의 생명주기를 따라간다.

Thread.sleep 대신 delay를 쓰면 아래와 같은 에러가 발생한다.

왜냐하면 delay 함수는 thread를 블록하지 않고 코루틴을 중단시키는 특수한 함수이기 때문에 코루틴에서 정의한 suspend function 에서만 사용할 수 있다.

 

Blocking과 Non-blocking 

위의 예제는 아래 2가지를 쎃기 때문에 혼동이 올 수 있다.

  • blocking : Thread.sleep()
  • non-blocking: delay()

아래의 예제처럼 runBlocking이라는 coroutine builder를 이용하여 blocking에 대해 명확하게 알 수 있도록 해준다.

 

작업 범위 내에서 코루틴 생성하기

  • Global.launch를 사용하면 애플리케이션 생명주기를 따라가기 때문에 일부 메모리의 자원을 소모하게 됨 
    -> 리스크 발생
    -> 작업 범위 내에서 코루틴 생성하기
  • runBlocking 내부에서 만들어진 모든 코루틴이 완료될 때까지 완료되지 않음

coroutineScope

couroutineScope를 이용하여 자신만의 스코프를 생성할 수 있다. 모든 하위 launch가 완료될 때까지 종료되지 않음

그럼 runBlocking 이랑 무슨 차이일까?

  • runBlocking : 메서드가 대기 중인 현재 스레드를 차단
  • coroutineScope : 중단되는 동안 다른 스레드를 위해 기본 스레드를 해제

suspend function

리모트 서비스 호출이 아래처럼 각각의 함수에 있는 상황에서

두 결과를 가져와 연산을 하려면

아래처럼 합한 시간이 걸리게 된다

async를 이용하여 동시에 실행하기

  • 두 함수가 종속성이 없다면? 동시에 수행해도 됨
  • launch 와의 차이점 : launch는 Job을 반환하고 결과값을 제공하지 않는 반면 async는 나중에 결과를 제공하겠다는 Defereed 를 반환함

Cancellation 전파

  • 코루틴 스코프 내부에서 예외를 발생시키면 그 범위에서 launch한 모든 코루틴이 취소된다.