기본 디스패처디스패처를 설정하지 않으면 기본적으로 설정되는 디스패처는 CPU 집약적인 연산을 수행하도록 설계된 `Dispatchers.Default`이다.이 디스패처는 코드가 실행되는 컴퓨터의 CPU 개수와 동일한 수(최소 두 개 이상)의 스레드 풀을 가지고 있다. CPU 집약적인 연산을 수행하며 블로킹이 일어나지 않는 환경 같이 스레드를 효율적으로 사용하고 있다고 가정하면 이론적으로는 최적의 스레드 수라고 할 수 있다.다음 코드를 통해 디스패처를 확인할 수 있다.suspend fun main(): Unit = coroutineScope { repeat(1_000) { launch(Dispatchers.Default) { List(1000) { Random...
생각의 흐름데이터를 동시에 가져와야 할 상황에서 `getUserPorfile` 함수가 있다고 생각해 보자.다음 예제에서 중단 함수에서 중단 함수를 호출한다. 데이터를 동시에 가져와야 할 상황에서는 적합하지 않다. (2초가 걸리기 때문에)suspend fun getUserProfile(): UserProfileData { val user = getUserData() // 1초 후 val notifications = getNotifications() // 1초 후 return UserProfileData( user, notifications )} ?? : 아니 그럼 `GlobalScope` 사용해서 `async` 사용하면 되는 거 아님? ㅋㅋsuspend fun getUserProfi..
예외 처리예외 처리는 코루틴의 작동 원리 중 중요한 기능이다. 잡히지 않은 예외가 발생하면 프로그램이 종료되는 것처럼 코루틴도 잡히지 않는 예외가 발생했을 때 종료된다. 예외는 자식에서 부모로 전파되며, 부모가 최소 되면 자식도 취소되기 때문에 쌍방으로 전파된다. 예외 전파가 정지되지 않으면 계통 구조상 모든 코루틴이 취소되게 된다. 코루틴 종료 멈추기코루틴이 종료되기 전에 예외를 잡는 건 도움이 되지만.. 조금이라도 늦으면 이미 늦어버린 것이다..코루틴 간의 상호작용은 Job을 통해서 일어나기 때문에, 코루틴 빌더 내부에서 새로운 코루틴 빌더를 try-catch 문을 통해 래핑하는 건 전혀 도움이 되지 않는다. 그러니 예외 처리를 잘 이해해 보자 SupervisorJob코루틴 종료를 멈추는 가장 중요한..
기본적인 취소Job 인터페이스는 취소하게 하는 `cancel` 메서드를 가지고 있다. `cancel`메서드를 호출하면 다음과 같은 효과를 가져올 수 있다.- 호출한 코루틴은 첫 번째 중단점에서 Job을 끝낸다.- Job이 자식을 가지고 있다면, 그들 또한 취소된다. 하지만 부모는 영향을 받지 않는다.- Job이 취소되면, 취소된 잡은 새로운 코루틴의 부모로 사용될 수 없다. 취소된 잡은 `Cancelling`상태가 되었다가 `Cancelled` 상태로 바뀐다. `cancel`이 호출된 뒤 다음 작업을 진행하기 전에 취소 과정이 완료되는 것을 기다리기 위해 join을 사용하는 것이 일반적이다. `join`을 호출하지 않으면 경쟁 상태(race condiction)가 될 수도 있다. suspend fun m..