Asynchronous or non-blocking programming is an important part of the development landscape. When creating server-side, desktop, or mobile applications, it's important to provide an experience that is not only fluid from the user's perspective, but also scalable when needed.
Kotlin solves this problem in a flexible way by providing coroutine support at the language level and delegating most of the functionality to libraries.
In addition to opening the doors to asynchronous programming, coroutines also provide a wealth of other possibilities, such as concurrency and actors.
언어 수준에서 지원하는 코루틴은 라이브러리에게 대부분의 기능을 위임하여, 비동기/논블록킹 프로그래밍을 할 수 있게 해준다. 비동기 프로그래밍 뿐만 아니라 동시성, 액터 등 다양한 기능들도 제공한다.
추가로, Coroutine 기능은 Kotlin 언어에 내장되어 있다. 따라서 Gradle을 설정하면 별도의 설정 없이 코루틴을 사용할 수 있다. 하지만 안드로이드에서 Coroutine을 사용하기 위해서는 안드로이드 런타임을 위한 라이브러리를 세팅해야 한다. 해당 라이브러리는 coroutines-core와 coroutine-android 이다. 보통의 애플리케이션의 경우 coroutine-core만 셋팅하면 된다. 그렇다면 왜 안드로이드에서는..?
"안드로이드에서 coroutines-android가 추가적으로 필요한 이유"
안드로이드는 스레드를 일반적인 JVM 어플리케이션과 다르게 사용하기 때문이다. 또한 안드로이드 어플리케이션은 Main Thread에서 충돌이 일어나게 되면 강제로 종료되는데 이러한 강제 종료가 일어나기 전 예외를 처리하기 위해 별도의 android용 coroutine 라이브러리인 coroutines-android가 필요하다.
참고한 블로그의 Coroutine 시리즈
정리가 너무 깔끔하시다.이런 분들의 글을 보다가 내 글을 보면 처참하다고 느껴질 때가 있다..ㅋㅋ
음? 쓰레드를 사용하기 위해 Coroutine을 사용하는 것이 아니던가? 분명 저번 글은 쓰레드에 대한 글이었다. 분명 Coroutine은 멀티 쓰레딩/비동기 프로그래밍을 위한 기능이다. 하지만 작동 방식이 기존 Thread와 다르다. 일단 Coroutine을 사용하는 이유에 대해 알아보자.
스레드 대신 코루틴을 사용하는 이유
코루틴은 동시성 프로그래밍을 가능하도록 하는, 기존에 존재하던 개념이다. 이후 스레드의 자원 경쟁, 데드락 등의 문제의 이유로 다시 주목 받고 있다. 코루틴은 별도의 스레드 없이 메인 스레드 상에서 번갈아가며 병렬처리와 유사한 동작을 수행한다. 스레드는 여러 스레드가 한꺼번에 동시에 실행되는 반면, 코루틴은 프로그램이 실행 중 특정 시점에 코루틴으로 이동하고, 진행 중이던 루틴은 정지한다. 이는 기존 동기화 프로그래밍과 유사해보인다. 하지만 기존 프로그래밍은 에러가 나지 않는 이상 실행 중인 코드를 빠져나올 수 있는 부분은 return과 같은 마지막 코드 부분이지만 "코루틴은 실행 중간에 해당 함수를 빠져 나와 다른 코드를 실행할 수 있으며 실행 중이었던 이전의 루틴으로 이동하는 것 또한 가능"하다. 코루틴은 스레드 내부에서 작은 스레드"처럼" 동작하는 코루틴이 존재한다. 이와 같은 이유로 코루틴을 경량 스레드 사용이라고 한다. 다음은
싱글코어에서 코루틴은 이동 시점이 더 잘 조절되며 context switching이 적어 성능 면에서 스레드보다 좋을 수 있다. 하지만 멀티코어 프로세서를 활용할 수 없다는 문제점이 있으며 스레드보다 성능이 떨어질 수 있다.
스레드는 생성 비용이 비싸고 작업을 전환하는 비용이 비싸다.
한 스레드가 다른 스레드부터의 작업을 기다려야 할 때 Blocking되면 해당 스레드는 하는 작업 없이 다른 스레드의 작업이 마칠 때까지 기다려야 하기 때문에 자원이 낭비될 수 있으며, 이처럼 실제 성능의 반도 발휘하지 못하게 하는 Blocking이 반복적으로 발생할 수 있다. (스레드의 고질적인 문제점)
이와 같은 Blocking 발생 문제를 코루틴을 활용하여 아래와 같이 해결한다. Thread1에서 코루틴을 사용하지 않았다면 Thread2에 대한 Blocking이 발생했을 때 "작업2 수행이 종료될 때까지 자원 낭비가 발생했을 것"이다.
"코루틴은 스레드 안에서 실행되는 일시 중단 가능한 작업의 단위이다"
더 쉽게 설명하면 스레드 안의 작은 경량 스레드이다.
하나의 프로세스 내에 여러 스레드가 존재할 수 있는 것처럼, 하나의 스레드에 여러 코루틴이 존재할 수 있다.
그리고 안드로이드 문서 - 코루틴로 다시 가보자.
안드로이드 문서 - 코루틴으로 성능 향상하기
스레드를 정확하게 이해하고 사용하기 위해선 다음과 같은 개념들을 공부해야 한다.
요정도하면 간략하게 코루틴에 대한 이해를 할 수 있을 것이다.