본문 바로가기
Kotlin

[코틀린] 코루틴 (Coroutine)

by Sky Titan 2020. 11. 7.
728x90

코루틴 (Coroutine)

  • 코틀린에서 기본적으로 제공하는 비동기처리 라이브러리
  • 루틴 (Routine) : 하나의 개별적인 작업을 의미
  • 코루틴은 넌블로킹 코드 (Non - Blocking Code), 비동기 코드를 마치 동기 코드처럼 쉽게 작성하면서도 비동기 효과를 낼 수 있게 한다.
  • 문맥 교환 없이 루틴을 일시 중단하고 다른 루틴을 실행할 수 있다.

 

블로킹 코드 (Blocking Code)

  • 애플리케이션 실행 시 운영체제 대기 큐에 들어가면서 요청에 대한 시스템 콜이 완료된 후에 응답할 수 있는 코드

 

넌블로킹 코드 (Non-blocking Code)

  • 애플리케이션 실행 시 운영체제 대기 큐에 들어가지 않고 바로 요청에 대한 결과를 반환할 수 있는 코드
  • 스레드와 같은 기법으로 구성하기에 성능은 뛰어나지만 코드가 복잡해져서 안전하지 못한 코드가 될 확률이 높음

 

동기 코드 (Synchronous)

  • 스레드가 실행되기 전에 특정 작업이 완료되기까지 기다려야 하는 코드
  • blocking, 혹은 non-blocking 방식으로 구현 가능

 

비동기 코드 (Asynchronous)

  • 스레드가 실행될 때 다른 작업을 기다릴 필요 없고 작업이 완료되면 콜백을 통해 결과를 알려주는 코드

 

코루틴 빌드 하는 방법

1. launch

  • 코루틴 빌더 (새로운 코루틴 생성함)
  • 코루틴의 상태를 파악할 수 있는 Job 객체를 반환한다.
  • GlobalScope : 생명주기가 애플리케이션에 종속되어있으므로 애플리케이션 종료 시 같이 종료된다. (process가 살아있는 한 계속 유지된다.) → 취소되지 않는 동작을 원할 때 사용
  • CoroutineScope : 애플리케이션의 생명주기와는 상관 없다. (되도록이면 CoroutineScope를 쓰는 것을 권장)
import kotlinx.coroutines.*

fun main() {

    //새로운 코루틴 생성 -> 백그라운드에서 실행됨 -> 코루틴의 상태를 확인 가능한 Job 객체 반환
    var job = CoroutineScope(Dispatchers.Default).launch {
        delay(2000)
        println("in Background")//2초후에 출력
    }

    println("in Foreground")//바로 출력

    println("isActive : ${job.isActive}, isCompleted : ${job.isCompleted}")
    Thread.sleep(3000)//3초 대기
    println("isActive : ${job.isActive}, isCompleted : ${job.isCompleted}")

    /* 결과 :
    in Foreground
    isActive : true, isCompleted : false
    in Background
    isActive : false, isCompleted : true
     */
}

 

2. async

  • launch와 다르게 Deferred<T>를 통해 결과값을 반환한다.
  • await() 등의 함수를 통하여 지연된 결과값을 받는 것이 가능하다.
import kotlinx.coroutines.*

fun main() {

    //새로운 코루틴 생성 -> 백그라운드에서 실행됨 -> 코루틴의 상태를 확인 가능한 Job 객체 반환
    CoroutineScope(Dispatchers.Default).async {


        var a = async(Dispatchers.Default) {
            delay(1000)
            "Completed"
        }
        println("first")//바로 출력
        println(a.await())//1초 뒤 출력
    }

    //프로세스 종료 방지
    Thread.sleep(2000)
    /* 결과 :
    first
    Completed
     */
}
728x90

댓글