Kotlin/코틀린 코루틴의 정석 9

[Kotlin 코루틴] 코루틴 심화

공유 상태를 사용하는 코루틴의 문제와 데이터 동기화 1. 가변 변수를 사용할 때의 문제점쓰레드 간에 데이터를 전달하거나 공유된 자원을 사용하는 경우에는 가변 변수를 사용해 상태를 공유하고 업데이트해야 함하지만 여러 쓰레드에서 가변 변수에 동시에 접근해 값을 변경하면 데이터의 손실 혹은 불일치로 인해 심각한 버그가 발생 가능코루틴은 주로 멀티 쓰레드 환경에서 실행되기 때문에 코루틴을 사용할 때도 동일한 문제가 발생 가능   위 코드에서 결과가 예상한대로 나오지 않는 이유 1.1 메모리 가시성 문제해당 문제는 쓰레드가 변수를 읽는 메모리 공간에 관한 문제로 CPU 캐시와 메인 메모리 등으로 이루어진 하드웨어의 메모리 구조와 연관되어 있음쓰레드가 변수를 변경시킬 때 메인 메모리가 아닌 CPU 캐시를 사용할 경..

[Kotlin 코루틴] 코루틴의 이해

서브루틴과 코루틴 1. 루틴과 서브루틴프로그래밍 과점에서 루틴은 `특정한 일을 처리하기 위한 일련의 명령`이라는 뜻으로 사용이런 일련의 명령을 함수 또는 메서드라고 지칭 서브루틴은 함수 내에서 함수가 호출될 경우 호출된 함수간단하게 설명하면 서브루틴이란 함수의 하위(sub)에서 실행되는 함수를 지칭서브루틴은 한 번 호출되면 끝까지 실행됨따라서 루틴에 의해 서브루틴이 호출되면 루틴을 실행하던 쓰레드는 서브루틴을 실행하는 데 사용되어 서브루틴의 실행이 완료될 때까지 루틴은 다른 작업을 할 수 없음 (blocking) 2. 서브루틴과 코루틴의 차이서브루틴과 달리 코루틴은 함께(co) 실행되는 루틴으로 서로 간에 쓰레드 사용을 양보하며 함께 실행됨  부연 설명부모 코루틴은 while 문을 통해 `부모 코루틴에서..

[Kotlin 코루틴] 일시 중단 함수

일시 중단 함수와 코루틴 1. 일시 중단 함수란?주로 코루틴의 비동기 작업과 관련된 복잡한 코드들을 구조화하고 재사용할 수 있는 코드의 집합으로 만드는 데 사용`suspend fun` 키워드로 선언되는 함수로 함수 내에 일시 중단 지점을 포함할 수 있는 특별한 기능을 수행함일시 중단 지점"은 코루틴(coroutine) 내에서 실행이 일시적으로 중단될 수 있는 지점을 의미ex) delay 함수의 경우 일시 중단 지점을 포함하므로 일반 함수는 delay 함수가 포함시킬 수 없고 오직 suspend fun 함수만 delay 함수를 포함시킬 수 있음  2. 일시 중단 함수는 코루틴이 아니다일시 중단 함수는 코루틴 내부에서 실행되는 코드의 집합일 뿐, 코루틴이 아님일시 중단 함수는 기존의 함수와 똑같은 재사용이 ..

[Kotlin 코루틴] 예외 처리

서론코루틴의 비동기 작업은 IO 작업을 수행하는 데 쓰이는 경우가 많아 예측할 수 없는 예외가 발생할 가능성이 높으므로 코루틴에 대한 적절한 예외 처리는 안정적인 애플리케이션을 만드는 데 필수적입니다.코루틴은 이를 위해 예외를 안전하게 처리할 수 있도록 만드는 여러 장치를 갖고 있으며 이번 게시글에서는 이에 대해 간단히 정리하겠습니다. 코루틴의 예외 전파코루틴 실행 도중 예외 발생 시 예외가 발생 코루틴은 취소되고 부모 코루틴으로 예외가 전파됨만약 부모 코루틴에서도 예외가 적절히 처리되지 않을 경우 부모 코루틴도 취소되고 예외는 다시 상위 코루틴으로 전파됨위 과정이 반복되면 결국 최상위 코루틴인 루트 코루틴까지 예외가 전파될 수 있음 코루틴이 예외를 전파받아 취소되면 해당 코루틴만 취소되는 것이 아니라 ..

[Kotlin 코루틴] 구조화된 동시성

구조화된 동시성의 원칙비동기 작업을 구조화함으로써 비동기 프로그래밍을 보다 안정적이고 예측할 수 있게 만드는 원칙코루틴은 구조화된 동시성의 원칙을 사용해 비동기 작업인 코루틴을 부모-자식 관계로 구조화함으로써 코루틴이 보다 안전하게 관리되고 제어하도록 지원부모 코루틴을 만드는 코루틴 빌더의 람다식 속에서 새로운 코루틴 빌더를 호출하면 코루틴을 부모-자식 관계로 구조화할 수 있음 구조화된 코루틴의 특징부모 코루틴의 실행 환경이 자식 코루틴에게 상속됨작업을 제어하는 데 사용됨부모 코루틴이 취소되면 자식 코루틴도 취소됨부모 코루틴은 자식 코루틴이 완료될 때까지 대기CoroutineScope를 사용해 코루틴이 실행되는 범위를 제한 가능 실행 환경 상속 1. 부모 코루틴의 실행 환경 상속부모 코루틴은 자식 코루틴..

[Kotlin 코루틴] CoroutineContext 정리

서론대표적인 코루틴 빌더 함수인 launch와 async의 코드를 보면 다음과 같습니다.  위 코드 스니펫에서 볼 수 있다시피 launch와 async 함수는 매개변수로 context, start, block을 가집니다.context의 타입은 CoroutineContextstart의 타입은 CoroutineStartlaunch 함수의 block은 Unit을 반환하는 람다식async 함수의 block은 제네릭 타입 T를 반환하는 람다식 CoroutineContext는 코루틴을 실행하는 실행 환경을 설정하고 관리하는 인터페이스로 CoroutineContext 객체는 다음의 객체들을 조합해 코루틴의 실행 환경을 설정합니다.CoroutineDispatcherCoroutineNameJobetc. 정리하자면 Cor..

[Kotlin 코루틴] async와 Deferred

서론launc 코루틴 빌더를 통해 생성되는 코루틴은 기본적으로 작업 실행 후 결과를 반환하지 않지만async 코루틴 빌더를 통해 생성된 코루틴으로부터 결괏값을 수신받을 수 있음async 함수를 사용하면 결괏값이 있는 코루틴 객체인 Deferred가 반환됨Deferred 객체를 통해 코루틴으로부터 결괏값을 수신할 수 있음 async 사용해 결괏값 수신하기 1. async 사용해 Deferred 생성하기async 함수는 launch 함수와 유사하지만 다음과 같은 차이점이 존재함launch는 코루틴이 결괏값을 직접 반환할 수 없기 때문에 Job 객체를 반환async는 코루틴의 결괏값을 직접 반환하고 결괏값을 담아 반환하기 위해 Deferred 타입의 객체를 반환 * Deferred는 Job과 같이 코루틴을 추..

[Kotlin 코루틴] 코루틴 빌더와 Job 정리

코루틴 빌더와 Job 객체 개요코루틴을 생성하는 데 사용하는 함수ex) runBlocking, launch 모든 코루틴 빌더 함수는 코루틴을 만들고 코루틴을 추상화한 Job 객체를 생성코루틴은 일시 중단할 수 있는 작업으로 실행 도중 일시 중단된 후 이후 이어서 실행될 수 있음코루틴을 추상화한 Job 객체는 이에 대응해 코루틴을 제어할 수 있는 함수와 코루틴의 상태를 나타내는 상태 값들을 외부에 노출시킴   부연 설명launch 함수 호출 시 코루틴 생성Job 객체가 생성되고 반환되는 것을 확인 가능 join을 사용한 코루틴 순차 처리Job 객체는 순차 처리가 필요한 상황을 위해 join 함수를 제공join 함수를 통해 먼저 처리되어야 하는 코루틴의 실행이 완료될 때까지 호출부의 코루틴을 일시 중단하도록..

[Kotlin 코루틴] CoroutineDispatcher 정리

Dispatcher란?dispatch와 -er의 합성어dispatch의 `보내다`라는 뜻에 -er이 붙어 `무언가를 보내는 주체`라는 뜻 CoroutineDispatcher`코루틴을 보내는 주체`코루틴은 일시 중단이 가능한 `작업`이기 때문에 쓰레드가 있어야 실행될 수 있음CoroutineDispatcher는 코루틴을 쓰레드로 보내 실행시키는 역할코루틴을 쓰레드로 보내는 데 사용할 수 있는 쓰레드나 쓰레드 풀 가짐코루틴을 실행 요청한 쓰레드에서 코루틴이 실행되도록 만들 수 있음 CoroutineDispatcher 동작 과정CoroutineDispatcher 객체에 코루틴의 실행이 요청됨CoroutineDispatcher 객체는 실행 요청받은 코루틴을 작업 대기열에 적재시킴CoroutineDispatche..