
코루틴에서는 디스패처를 통해 코루틴이 실행되어야 할 스레드(또는 스레드 풀)를 결정한다.영어 사전에서 디스패처는 '사람이나 긴급 차량을 필요한 곳에 보내는 사람'이라 정의한다. 기본 디스패처디스패처를 설정하지 않으면 Dispatchers.Default가 기본적으로 설정된다.Dispatchers.Default는 프로그램이 실행되는 컴퓨터의 CPU 개수와 동일한 수(최소 두 개 이상)의 스레드 풀을 가지고 있다.이는 스레드를 효율적으로 사용한다고 가정했을 때, 이론적으로 가장 최적의 스레드 수다.따라서 Dispatchers.Default는 CPU 집약적인 연산을 수행하기에 적합하다. suspend fun main() = coroutineScope { repeat(1000) { launch..
여러 비동기 함수에서 데이터를 동시에 얻어야 하는 경우를 생각해 보자. 코루틴 스코프 함수가 소개되기 전에 사용한 방법들 suspend fun getUserProfile(): UserProfileData { val user = getUserData() // 1초 후 val notifications = getNotifications() // 1초 후 return UserProfileData( user = user, notifications = notifications, )}먼저 중단 함수에서 중단 함수를 호출하는 방법이 있다. 하지만 이런 방식은 작업이 동시에 진행되지 않는다.하나의 함수에서 데이터를 얻는 데 1초씩 걸리기 때문에 총 2초가 걸린다. susp..

코루틴은 잡히지 않은 예외가 발생했을 때 종료된다스레드도 동일한 경우에 종료되지만, 차이점이 있다.코루틴 빌더는 부모도 종료시키고, 종료된 부모는 자식들까지 모두 취소시킨다는 것이다. fun main(): Unit = runBlocking { launch { launch { delay(1000) throw Error("Some error") } launch { delay(2000) println("Will not be printed") } launch { delay(500) println("W..
코루틴에서 아주 중요한 기능 중 하나는 바로 취소다.작업을 취소하기 위해 단순히 스레드를 죽이는 것은 최악의 방법이다. 연결을 닫고 자원을 해제할 방법이 없기 때문이다.개발자들이 상태가 Active한지 계속해서 확인하는 방법도 불편하다.코루틴의 취소 방식은 아주 간단하고 편리하며, 안전하다. 기본적인 취소Job 인터페이스는 잡을 취소하는 cancel() 함수를 가지고 있다. cancel() 함수를 호출하면 다음과 같은 효과가 일어난다.cancel()을 호출한 코루틴은 첫 번째 중단점에서 잡을 끝낸다.잡의 자식들도 취소된다. 하지만 잡의 부모는 영향을 받지 않는다.취소된 잡은 새로운 코루틴의 부모로 사용될 수 없다. 취소된 잡은 Cancelling 상태가 되었다가 Cancelled 상태가 된다. canc..

지난 포스팅에서 구조화된 동시성의 특성에 대해 배웠다.자식 코루틴은 부모 코루틴으로부터 컨텍스트를 상속받는다.부모 코루틴은 모든 자식 코루틴이 작업을 마칠 때까지 기다린다.부모 코루틴이 취소되면 자식 코루틴도 취소된다.자식 코루틴에서 에러가 발생하면, 부모 코루틴도 에러로 소멸된다.구조화된 동시성의 특성은 Job 컨텍스트와 관련이 있다.Job은 코루틴을 취소하고, 상태를 파악하는 등 다양하게 사용될 수 있다. Job이란 무엇인가?잡은 수명을 가지고 있고 취소 가능하다.Job은 인터페이스지만 구체적인 사용법과 상태를 가지고 있기 때문에 추상 클래스처럼 다룰 수도 있다. 잡의 수명은 상태로 나타낸다. 위 그림은 잡의 상태와 상태 변화를 나타낸 도식도이다.ActiveActive 상태에서는 잡이 실행되고 코루..
fun CoroutineScope.launch( context: CoroutineContext = EmptyCoroutineContext, start: CoroutineStart = Coroutinestart.DEFAULT, block: suspend CoroutineScope.() -> Unit): Job { ...}코루틴 빌더 함수의 시그니처 첫 번째 파라미터가 CoroutineContext라는 사실을 알 수 있다.빌더 함수의 리시버뿐만 아니라 마지막 인자의 리시버도 CoroutineScope 타입이다. interface CoroutineScope { val coroutineContext: CoroutineContext}CoroutineScope는 CoroutineConte..

중단 함수는 Continuation 객체를 다른 중단 함수로 전달한다.따라서 중단 함수는 일반 함수를 호출할 수 있지만, 일반 함수는 중단 함수를 호출할 수 없다.모든 중단 함수는 다른 중단 함수에 의해 호출되어야 한다. 이때 중단 함수를 시작하는 지점이 코루틴 빌더다.코루틴 빌더는 일반 함수와 중단 함수를 연결시키는 다리가 된다.kotlinx.coroutines 라이브러리가 제공하는 필수적인 코루틴 빌더 세 가지를 탐색해 보자.launchrunBlockingasync launch 빌더thread 함수를 호출하여 새로운 스레드를 시작하는 것과 비슷하다.코루틴을 시작하면 별개의 작업으로 실행된다.fun main() { GlobalScope.launch { delay(1000L) ..
코틀린 언어에서 자체적으로 지원하는 부분(컴파일러의 지원과 코틀린 기본 라이브러리의 요소)코틀린 코루틴 라이브러리(kotlinx.coroutines)코루틴은 두 가지로 구성되어 있다. 코틀린 언어 차원에서는 자유도를 보장하기 위해 코루틴을 최소한으로 지원하고 있다.다른 프로그래밍 언어에서 동시성을 구현한 스타일을 이식 하기 위해 사용할 수 있지만, 직접 다루기 쉽지는 않다.그 예로 suspendCoroutine()이나 Continuation 등이 있다.애플리케이션 개발자들보다는 라이브러리 개발자들에게 적합하다. 언어 차원에서 지원하는 것과 별개로 kotlinx.coroutines 라이브러리가 있다.이 라이브러리를 사용하려면 프로젝트에 별도로 의존성을 추가해야 한다.라이브러리는 코틀린 언어 차원에서 코루..