Kotlin/포스팅

코루틴 디스패치

짜집퍼박사(짜박) 2024. 1. 9. 18:18

코루틴 디스패치(Dispatch)는 코루틴이 어떤 스레드 또는 어떤 스레드 풀에서 실행될지를 결정하는 메커니즘입니다. 코루틴 디스패치는 코루틴이 비동기적으로 실행되는 환경에서 중요한 역할을 합니다. Kotlin에서는 여러 가지 디스패처가 제공되며, launch, async, runBlocking 등의 함수에서 사용할 수 있습니다.

 

1. 디스패처 종류

1.1. Dispatchers.Default

Default 디스패처는 CPU에 대한 최적화된 디스패처입니다. 일반적인 CPU 연산이 실행되는 스레드 풀에서 동작하며, 코루틴이 CPU 바운드 작업을 수행할 때 적합합니다.

import kotlinx.coroutines.*

fun main() = runBlocking {
    launch(Dispatchers.Default) {
        // CPU 바운드 작업
        println("Running on ${Thread.currentThread().name}")
    }
}

1.2. Dispatchers.IO

IO 디스패처는 입출력 작업에 최적화된 디스패처입니다. 네트워크 호출이나 파일 입출력과 같은 블로킹 작업을 수행할 때 사용됩니다.

import kotlinx.coroutines.*

fun main() = runBlocking {
    launch(Dispatchers.IO) {
        // 입출력 작업
        println("Running on ${Thread.currentThread().name}")
    }
}

1.3. Dispatchers.Main

Main 디스패처는 안드로이드나 UI 프레임워크와 같이 UI 작업을 처리하는 스레드에서 동작합니다. 안드로이드에서 사용할 때만 사용 가능하며, 주로 UI 업데이트에 활용됩니다.

import kotlinx.coroutines.*

fun main() = runBlocking {
    launch(Dispatchers.Main) {
        // UI 작업
        println("Running on ${Thread.currentThread().name}")
    }
}

1.4. Dispatchers.Unconfined
Unconfined 디스패처는 부모 코루틴의 컨텍스트를 상속하고, 실행이 시작된 스레드에서 계속 실행됩니다. 특정 스레드에 고정되지 않고 자유롭게 전환됩니다.

import kotlinx.coroutines.*

fun main() = runBlocking {
    launch(Dispatchers.Unconfined) {
        // 현재 스레드에서 실행
        println("Running on ${Thread.currentThread().name}")

        // 다른 디스패처로 전환 가능
        withContext(Dispatchers.Default) {
            println("Running on ${Thread.currentThread().name}")
        }
    }
}

 

2. 디스패처 설정

코루틴 빌더 함수인 launch, async 등에서는 CoroutineDispatcher를 명시적으로 지정할 수 있습니다.

import kotlinx.coroutines.*

fun main() = runBlocking {
    val customDispatcher = Executors.newFixedThreadPool(2).asCoroutineDispatcher()

    launch(customDispatcher) {
        // 사용자 정의 스레드 풀에서 실행
        println("Running on ${Thread.currentThread().name}")
    }
}

 

3. 자동 디스패치

코루틴이 launch 또는 async로 시작될 때, 부모 코루틴의 디스패처를 상속받습니다. 만약 부모 코루틴이 어떤 디스패처에서 실행 중이면, 자식 코루틴도 그 디스패처에서 실행됩니다.

import kotlinx.coroutines.*

fun main() = runBlocking {
    launch(Dispatchers.Default) {
        // 부모 코루틴의 디스패처를 상속받음
        println("Running on ${Thread.currentThread().name}")
    }
}

코루틴 디스패치는 애플리케이션의 특정 요구사항에 따라 다르게 조절될 수 있습니다. 다양한 디스패처를 활용하여 CPU, 입출력, UI 등의 다양한 작업을 효과적으로 처리할 수 있습니다.

 

With ChatGPT

'Kotlin > 포스팅' 카테고리의 다른 글

코틀린 동시성 통신  (0) 2024.01.09
코루틴 예외 처리  (0) 2024.01.09
코루틴 타임아웃  (0) 2024.01.09
코루틴 취소  (0) 2024.01.09
코루틴 잡 생명 주기  (0) 2024.01.09