Android-Kotlin/Coroutine

[Coroutine] Dispatcher 란? - Kotlin

주톨 2022. 6. 22. 23:55
728x90

 

Coroutine Context는 Coroutine Dispatcher 라는 녀석을 항상 포함하는데 무엇인지 알아보겠습니다.

 

 

Dispatcher

 

Dispatch는 한국어로 "보내다" 입니다.  Dispatcher는 무엇을 보내는 것입니다.

무엇을 보낼까요?  스레드(Thread)에 코루틴(Coroutine)을 보냅니다.
즉 코루틴을 만든다음에 해당 코루틴을 Dispatcher로 전송하면 Dispatcher는 자신이 관리하는 스레드풀 내의
스레드의 부하 상황에 맞춰 코루틴을 배분합니다.

 

Android Dispatcher

안드로이드에는 Dispatcher가 이미 생성되어 있어서 별도의 Dispatcher를 생성하거나 정의하지 않아도 됩니다.

  • Dispatchers.Default  
     -  CPU를 많이 사용하는 작업을 Main Thread가 아닌 다른 Thread에서 CPU작업을 하기 위해 만들어졌습니다.
     -  CPU core 개수만큼 동시에 돌릴 수 있으며, 최소 2개로 돌립니다.
     -  리스트 정렬이나, JSON Parsing 작업에 최적화 되어 있습니다.

 

  • Dispatchers.Main
    - UI 작업을 위한 Main Thread로 이동시키는 코루틴 디스패처.
    - UI와 상호작용하는 작업을 실행하기 위해서만 사용해야 한다.


  • Dispatchers.IO
    - 디스크 또는 네트워크 작업같이 쓰레드를 오랫동안 블락킹 하는 I/O 작업을 실행하기 위한 디스패처.
    - Dispatchers.Default 와 쓰레드를 공유하고 있다고 한다.


  • Dispatchers.Unconfined
    - 호출한 context를 기본으로 사용하는데 중단 후 다시 실행될 때 context가 바뀌면 바뀐 context를 따라가는 특이한         Dispatcher.

 

간단하게 사용해보기.

fun main(): Unit = runBlocking {
    launch {
        println("main runBlocking : 나는 ${Thread.currentThread().name} 쓰레드에서 일하고 있어요.")
    }
    launch(Dispatchers.Unconfined) {
        println("Unconfined : 나는 ${Thread.currentThread().name} 쓰레드에서 일하고 있어요.")
    }
    launch(Dispatchers.IO) {
        println("IO : 나는 ${Thread.currentThread().name} 쓰레드에서 일하고 있어요.")
    }
    launch(Dispatchers.Default) {
        println("Default : 나는 ${Thread.currentThread().name} 쓰레드에서 일하고 있어요.")
    }
}

 

launch(안에Dispatchers.---) 넣어줬습니다. 어느 쓰레드에서 돌아갈지 정해준겁니다.
첫줄을보면 그냥 launch만 썻을경우엔 부모 dispatcher를 상속 받습니다.
즉 dispatchers.main 입니다.
Thread.currentThread().name 은 지금 자신이 있는 쓰레드의 이름을 반환해줍니다.
 
실행결과