Kotlin/포스팅

코루틴 문맥

짜집퍼박사(짜박) 2024. 1. 7. 14:45

코루틴 문맥(Coroutine Context)은 코루틴이 실행되는 환경을 나타냅니다. 이 환경은 스레드 정보, 예외 처리 방식, 코루틴 실행을 위한 다양한 설정 등을 포함합니다. 코루틴은 launch, async 등을 통해 생성되며, 이때 특정한 문맥을 제공하여 실행됩니다.

 

1. CoroutineContext의 구성 요소

코루틴 문맥은 CoroutineContext 인터페이스를 통해 정의되며, 여러 구성 요소로 구성됩니다.

- Job: 코루틴의 생명주기를 관리하는 핵심 요소로, Job 인터페이스를 구현합니다.
- CoroutineDispatcher: 코루틴이 어떤 스레드에서 실행될지를 결정하는 요소로, CoroutineDispatcher 인터페이스를 구현합니다.
- CoroutineName: 코루틴의 이름을 지정하는 요소로, 디버깅 및 로깅에서 사용됩니다.
- CoroutineExceptionHandler: 코루틴에서 예외가 발생했을 때 처리 방식을 정의하는 요소로, CoroutineExceptionHandler 인터페이스를 구현합니다.

import kotlinx.coroutines.*

fun main() = runBlocking {
    val context: CoroutineContext = Job() + Dispatchers.Default + CoroutineName("MyCoroutine") + CoroutineExceptionHandler { _, throwable ->
        println("Caught an exception: $throwable")
    }

    launch(context) {
        println("Running on ${Thread.currentThread().name}")
        delay(1000)
        throw RuntimeException("An error occurred")
    }.join()
}

 

2. CoroutineDispatcher

CoroutineDispatcher는 코루틴이 어떤 스레드에서 실행될지를 결정합니다. 주요 디스패처에는 Dispatchers.Default, Dispatchers.IO, Dispatchers.Main 등이 있습니다.

import kotlinx.coroutines.*

fun main() = runBlocking {
    launch(Dispatchers.Default) {
        // 백그라운드 스레드에서 실행
        println("Running on ${Thread.currentThread().name}")
    }

    launch(Dispatchers.IO) {
        // I/O 작업을 위한 스레드에서 실행
        println("Running on ${Thread.currentThread().name}")
    }

    launch(Dispatchers.Main) {
        // 메인(UI) 스레드에서 실행
        println("Running on ${Thread.currentThread().name}")
    }
}

 

3. GlobalScope

GlobalScope는 애플리케이션 전역에서 사용되는 코루틴 문맥입니다. 주로 애플리케이션 수준에서의 코루틴 작업에 사용되며, 애플리케이션이 종료될 때까지 유지됩니다.

import kotlinx.coroutines.*

fun main() {
    GlobalScope.launch {
        // 애플리케이션 전역에서 실행되는 코루틴
        println("Running on ${Thread.currentThread().name}")
    }

    println("Main thread is not blocked.")
    Thread.sleep(2000)
    println("End")
}

 

4. Unconfined Dispatcher

Unconfined 디스패처는 부모 코루틴의 문맥을 상속받게 됩니다. 그러나 중간에 다른 스레드로 변경될 수 있습니다.

import kotlinx.coroutines.*

fun main() = runBlocking {
    launch(Dispatchers.Default) {
        // 백그라운드 스레드에서 실행
        println("Running on ${Thread.currentThread().name}")

        launch(Dispatchers.Unconfined) {
            // 부모 코루틴의 문맥을 상속받지만, 중간에 변경될 수 있음
            println("Running on ${Thread.currentThread().name}")
        }
    }
}

코루틴 문맥은 코루틴이 실행되는 환경을 정의하고, 특히 스레드와 예외 처리 등을 관리합니다. 적절한 디스패처와 설정을 사용하여 코루틴이 예상대로 동작하도록 할 수 있습니다.

 

With ChatGPT

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

코루틴 잡 생명 주기  (0) 2024.01.09
코루틴 흐름 제어  (0) 2024.01.09
코루틴 구조적 동시성  (0) 2024.01.07
코루틴 영역  (0) 2024.01.07
코루틴 빌더  (0) 2024.01.07