Kotlin/포스팅

코루틴 영역

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

코루틴 영역(coroutine scope)은 코루틴의 생명주기와 범위를 관리하는 개념입니다. 코루틴을 시작하고 실행하는 동안 적절한 코루틴 스코프를 사용하면 메모리 누수나 예기치 않은 동작을 방지할 수 있습니다. 코루틴 스코프는 다양한 빌더 함수나 클래스를 통해 생성되며, 여러 코루틴이 함께 동작하는 환경을 제공합니다.

 

1. GlobalScope

GlobalScope는 애플리케이션 전체 생명주기에 걸쳐 유지되는 전역 코루틴 스코프입니다. 그러나 애플리케이션이 종료될 때까지 코루틴이 계속 실행되므로 사용에 주의가 필요합니다.

import kotlinx.coroutines.*

fun main() {
    GlobalScope.launch {
        // 애플리케이션 전역에서 계속 실행되는 코루틴
        delay(1000)
        println("Coroutine in GlobalScope")
    }

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

 

2. runBlocking

runBlocking은 주로 테스트 코드나 메인 함수에서 사용되며, 주어진 블록 내에서 새로운 코루틴을 시작하고 완료될 때까지 현재 스레드를 차단합니다. runBlocking 블록 안에서 코루틴이 실행됩니다.

import kotlinx.coroutines.*

fun main() = runBlocking {
    launch {
        // 현재 스레드를 차단하지 않고 코루틴을 실행
        delay(1000)
        println("Coroutine in runBlocking")
    }

    println("Main thread is blocked until coroutine is done.")
}

 

3. coroutineScope

coroutineScope는 현재 코루틴의 범위 내에서 새로운 코루틴을 실행하며, 현재 스레드를 차단하지 않습니다. coroutineScope 내의 코루틴이 완료될 때까지만 현재 스레드가 차단됩니다.

import kotlinx.coroutines.*

suspend fun mySuspendingFunction() {
    coroutineScope {
        // 현재 스레드를 차단하지 않고 코루틴 실행
        delay(1000)
        println("Coroutine in coroutineScope")
    }
}

fun main() = runBlocking {
    launch {
        mySuspendingFunction()
    }

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

 

4. viewModelScope

Android의 ViewModel에서 사용되는 viewModelScope는 Android Architecture Components의 일부로, ViewModel의 생명주기에 맞춰진 코루틴 스코프를 제공합니다.

import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch

class MyViewModel : ViewModel() {
    fun doSomething() {
        viewModelScope.launch {
            // ViewModel의 생명주기에 맞춰진 코루틴 실행
            delay(1000)
            println("Coroutine in viewModelScope")
        }
    }
}

 

5. SupervisorJob

SupervisorJob은 부모 코루틴이 실패하더라도 자식 코루틴은 영향을 받지 않도록 하는 데 사용됩니다. 실패한 부모 코루틴의 영향을 받지 않으면서 자식 코루틴이 계속 실행됩니다.

import kotlinx.coroutines.*

fun main() = runBlocking {
    val supervisorJob = SupervisorJob()

    with(CoroutineScope(Dispatchers.Default + supervisorJob)) {
        // SupervisorJob을 사용한 부모 코루틴
        launch {
            println("Start parent coroutine")
            delay(1000)
            println("End parent coroutine")
        }

        launch {
            // 자식 코루틴
            println("Start child coroutine")
            delay(500)
            throw Exception("Exception in child coroutine")
        }

        delay(2000)
    }

    println("End")
}

코루틴 영역은 코루틴의 생명주기와 범위를 관리하는 중요한 개념입니다. 애플리케이션 전역에서 사용할지, 현재 코루틴 범위에서만 사용할지에 따라 적절한 코루틴 스코프를 선택하여 사용해야 합니다.

 

With ChatGPT

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

코루틴 문맥  (0) 2024.01.07
코루틴 구조적 동시성  (0) 2024.01.07
코루틴 빌더  (0) 2024.01.07
코루틴과 일시 중단 함수  (0) 2024.01.07
코틀린 코루틴  (0) 2024.01.07