코루틴은 하나의 라이브러리에 있을 것 같지만 아니다!
1) 코틀린은 언어 차원에서 표준 라이브러리에 최소한의 저수준 API만 제공하고,
2) 다양한 다른 라이브러리에서 코루틴을 활용할 수 있도록 되었다.
1) 코틀린은 언어 차원에서 표준 라이브러리인 kotlinx.coroutines
- 자유도를 보장하기 위해 필수 언어 차원에서의 최소한만 지원함
ㄴ> 여기에는 suspendCoroutine, Continuation 등
ㄴ> 라이브러리 개발자에게 적합
2) 다양한 다른 라이브러리
- 별도의 의존성을 추가해야 한다.
- 애플리케이션 개발자들에게 적합
- 이 중 JetBrains에서 개발한 kotlinx.coroutines에는 코루틴을 위한 많은 라이브러리가 대표적이다.
ㄴ> 여기에는 launch, async 등을 포함한 고수준의 코루틴 요소들이 포함되어 있다.
kotlinx.coroutines | kotlinx.coroutines |
언어 차원에서 표준 라이브러리 | JetBrains에서 개발한 코루틴 라이브러리 |
컴파일러가 지원하며 코틀린 기본 라이브러리에 포함되어 있음 (= 의존성 추가 필요없음) |
의존성을 별도로 추가해야 한다. |
suspendCoroutine, Continuation 등의 기본적인 것들과 suspend 키워드를 최소한으로 제공 |
launch, async, Deferred 등의 다양한 기능 제공 |
라이브러리 개발자에게 적합 | 애플리케이션 개발자들에게 적합 |
거의 모든 동시성 스타일이 허용됨 | 명확한 하나의 동시성 스타일을 위해 설계되어 있다. ex) 구조적 동시성(Structured Concurrency) |
직접 사용하기 아주 어렵다. | 사용하기 쉬우며, 동시성을 명확하게 구현할 수 있게 해 줌 |
여러 동시성 스타일들
- 스레드 기반 동시성(Thread-based Concurrency)
- 가장 전통적인 동시성 패턴 중 하나
- 각각의 작업을 별도의 스레드로 실행하여 동시성을 달성함
- 대부분의 프로그래밍 언어와 플랫폼에서 지원하지만 스레드를 직접 관리하는 것이 어렵고, 공유 자원에 대한 동기화 문제가 발생할 수 있다. - 이벤트 기반 동시성(Event-based Concurrency)
- 이벤트 루프를 사용하여 이벤트가 발생할 때마다 해당 이벤트를 처리하는 방식으로 비동기적인 이벤트 핸들러를 사용하여 동시성을 처리
- 주로 GUI 및 네트워크 프로그래밍에서 사용함.
- 대표적으로 Node.js가 이 패턴을 채택 - 액터 기반 동시성(Actor-based Concurrency)
- 액터라는 독립적인 실행 단위를 사용하여 동시성을 구현하는 방식으로,
각 액터는 메시지를 주고받으며, 메시지를 받으면 해당 액터가 처리합니다. 액터는 내부 상태를 가지고 있으며, 동시적으로 실행될 수 있다.
- Erlang과 Akka 프레임워크가 이러한 패턴을 지원함 - 데이터 병렬성(Data Parallelism)
- 데이터 병렬성은 데이터를 분할하여 여러 처리 단위에 동시에 적용하는 방식
- 이 방식은 SIMD(Single Instruction, Multiple Data) 명령어 집합을 사용하여 벡터 및 행렬 연산에 주로 사용 - 작업 기반 동시성(Task-based Concurrency)
- 작업 또는 태스크 단위로 동시성을 처리하는 방식으로
각 작업은 병렬로 실행될 수 있으며, 일반적으로 작업 큐 또는 스케줄러를 사용하여 관리됨
- 대표적으로 Java의 Executor 프레임워크 및 .NET의 Task Parallel Library(TPL)가 이러한 패턴을 지원함
=> 이 외 여러 동시성 패턴이 존재하며, 각각의 장단점이 있으므로 언어, 플랫폼, 애플리케이션의 요구사항에 따라 적절한 동시성 스타일을 선택해야 함
구조적 동시성(Structured Concurrency)?
- 코루틴을 구성하고 관리하는 방식을 의미
- 코루틴을 계층적 구조로 구성하여 부모-자식 관계를 유지하고, 부모 코루틴이 자식 코루틴의 수명을 관리합니다. 이렇게 하면 부모 코루틴이 완료되기 전에 자식 코루틴이 모두 완료될 수 있도록 보장할 수 있다.
- kotlinx.coroutines 라이브러리는 구조적 동시성을 중심으로 설계됨
- [장점1] 구조적 동시성을 사용하면 코루틴의 수명을 명시적으로 관리할 수 있으며, 코루틴이 예외를 던질 때 해당 예외를 적절하게 처리할 수 있다.
- [장점2] 코루틴이 병렬로 실행되는 동시성 작업을 효과적으로 구성할 수 있다.
출처
- https://discuss.kotlinlang.org/t/kotlin-coroutines-vs-kotlinx-coroutines/7937
- https://kotlinlang.org/docs/coroutines-overview.html#sample-projects
- [Book] 코틀린 코루틴 : 안드로이드 및 백엔드 개발자를 위한 비동기 프로그래밍 마르친 모스카와 저 / 신성열 역 | 인사이트(insight) | 2023년 11월 01일